|
Замена заглавных букв на прописные, если заглавных букв больше 5 подряд | ☑ | ||
---|---|---|---|---|
0
BalBess
28.10.13
✎
06:43
|
Есть такая задача, если в наименовании товара больше 5 заглавных букв подряд, то заменить на прописные, кроме первой. например:
Ноутбук SAMSUNG 300V5A, заменяем на: Ноутбук Samsung 300V5A Русских букв это тоже касается, цифры не в счет |
|||
1
Wobland
28.10.13
✎
06:47
|
задачу понял. дальше
|
|||
2
Godofsin
28.10.13
✎
06:49
|
5оо руб.
|
|||
3
BalBess
28.10.13
✎
06:51
|
дальше, как лучше сделать? ))
может через регулярки? кто поможет составить шаблон |
|||
4
BalBess
28.10.13
✎
06:53
|
[2] пока не рассматриваю, задача не срочная, попробую сам с помощью волшебного форума
|
|||
5
Wobland
28.10.13
✎
06:55
|
ТРег в помощь
|
|||
6
Wobland
28.10.13
✎
06:55
|
(5) хотя, тут не учитывается условие про 5 подряд
|
|||
7
mehfk
28.10.13
✎
07:00
|
Писал на коленке.
МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(МояСтрока, " "); НоваяСтрока = ""; Для Каждого Эл Из МассивСтрок Цикл Если СтрДлина(Эл.Значение) > 5 Тогда ПевыеПятьБукв = Лев(Эл.Значение, 5); Если ВРЕГ(ПевыеПятьБукв) = ПевыеПятьБукв Тогда НоваяСтрока = НоваяСтрока + " " + ВРЕГ(Лев(Эл.Значение,1)) + Нрег(Сред(Эл.Значение, 2, СтрДлина(Эл.Значение) - 1)); Иначе НоваяСтрока = НоваяСтрока + " " + Эл.Значение; КонецЕсли; Иначе НоваяСтрока = НоваяСтрока + " " + Эл.Значение; КонецЕсли; КонецЦикла; |
|||
8
mehfk
28.10.13
✎
07:03
|
Тюфу, нужны БУКВЫ, а не символы, тогда 5000 р.
|
|||
9
Галахад
гуру
28.10.13
✎
07:05
|
(8) Гм. А символы при ВРЕГ меняются, что-ли?
|
|||
10
2S
28.10.13
✎
07:07
|
(8) "кто ж цифры буквами пишет!?"
|
|||
11
BalBess
28.10.13
✎
07:09
|
(7) во первых, например SAMS128, он тоже сделает Sams128, что не правильно
во вторых например sAMSUMG, он пропустит, а его тоже надо преобразовывать |
|||
12
skunk
28.10.13
✎
07:15
|
(11)этого в первоначальном тз нет
|
|||
13
Wobland
28.10.13
✎
07:16
|
(12) >заменить на прописные, кроме первой
samsung получается |
|||
14
ICWiner
28.10.13
✎
07:16
|
Эм, ну как мне кажется самое простое - перебор символов строки в цикле. Уловие проверки НРег(Символ) <> Символ тогда ыы = ыы + 1. Считаешь сколько символов проходят по условию, если следующий нрег(символ) = символ смотришь чему равно ыы, если 5 и более - запоминаешь в массиве с какого символа и сколько нужно сдеать нрегом и обнуляешь ыы, если меньше 5 - просто обнуляешь ыы. Короче писанины на 5 минут. На красоту решения не претендую, но оптимизация тут не к чему - отрабатывать будет моментально.
|
|||
15
2S
28.10.13
✎
07:17
|
(11)
1.разложи в массив по словам 2.все в НРЕГ 3.Первую букву в ВРЕГ |
|||
16
Wobland
28.10.13
✎
07:18
|
(15) это называется титульный регистр, автору не подходит
|
|||
17
2S
28.10.13
✎
07:19
|
(16) обоснуй. По условиям все подходит
|
|||
18
Wobland
28.10.13
✎
07:21
|
(17) САМС -> Самс
|
|||
19
catena
28.10.13
✎
07:24
|
sAMSUNG по описанию задачи превратится в sAmsung
|
|||
20
Wobland
28.10.13
✎
07:25
|
(19) заменить на прописные, кроме первой.
откуда взялся верхний регистр у второго символа? |
|||
21
BalBess
28.10.13
✎
07:26
|
(17) Если букв 5 или менее, то оставляем как есть
1. массив по словам 2. длина слова менее 6, пропускаем 3. считаем перебором, число заглавных букв в слове 4. если больше 5, первая заглавная, остальные прописные как-то так, только как в п.3 не учитывать цифры? |
|||
22
Wobland
28.10.13
✎
07:28
|
(21) п.3 нужно уточнять - нужно ж подряд
|
|||
23
BalBess
28.10.13
✎
07:30
|
(19) мне нужно в любом случае сделать первую заглавную, остальные прописные,.т.е. sAMSUNG в Samsung
(22) да, с п.3 немного позаморочиться придется пошел делать... |
|||
24
Wobland
28.10.13
✎
07:33
|
не за что
|
|||
25
Песец
28.10.13
✎
07:38
|
(0) Чем отличаются "заглавные" буквы от "прописных"?
|
|||
26
Песец
28.10.13
✎
07:46
|
(25+)
Функция ЗаменаЗаглавныхБуквНаПрописные(стр) Возврат стр; КонецФункции :) |
|||
27
hhhh
28.10.13
✎
08:00
|
(23) а ACER и SONY?
|
|||
28
catena
28.10.13
✎
08:02
|
(20)Можно прочитать двояко: "первую букву в слове" и "первую букву в блоке больших букв".
|
|||
29
Wobland
28.10.13
✎
08:05
|
(28) это если применять фантазию. автор сформулировал вполне недвусмысленно имхо
|
|||
30
catena
28.10.13
✎
08:06
|
(29)Ну значит я не выспалась :)
|
|||
31
Wobland
28.10.13
✎
08:08
|
или я. подлежащего там нет. впрочем, пофих
|
|||
32
Песец
28.10.13
✎
08:18
|
(29) Тогда чего проще:
получаем слово (Ноутбук"SAMSUNG" это одно слово или два?), идем по нему циклом, маленькая буква сбрасывает проверку в ноль, большая увеличивает на единицу. Если проверка доросла до нужного количества - прерываемся, делаем Врег первая буква + Нрег остальные. |
|||
33
Песец
28.10.13
✎
08:23
|
(29) У автора написано "если в наименовании товара". Наименование может состоять из разного количества слов, в частности из одного. Надо поднимать первую букву наименования получается. Но из примера следует что надо дербанить наименование по словам (тут надо уточнить что является разделителями слов).
|
|||
34
BalBess
28.10.13
✎
09:15
|
Такая получилась конструкция
// Функция КолВоЗаглБуквПодряд(стрТемп, трбКолВо) // п.3 подсчитаем кол-во подряд идущих заглавных букв КолвоПодряд = 0; Для Поз=1 По СтрДлина(стрТемп) Цикл КодСим=КодСимв(Сред(стрТемп, Поз, 1)); // берем только A-Z и А-Я. т.е. с 65-90 и 192-223 // цифры и знаки препинания не в счет Если ((КодСим >= 65) И (КодСим <= 90)) ИЛИ ((КодСим >= 192) И (КодСим <= 223)) Тогда КолвоПодряд = КолвоПодряд + 1; Если КолвоПодряд > трбКолВо Тогда Возврат КолвоПодряд; КонецЕсли; Иначе КолвоПодряд = 0; КонецЕсли; КонецЦикла; Возврат КолвоПодряд; КонецФункции // Функция ПреобразоватьНаименование(Вхстрока, трбКолВо = 5) ВыхСтрока = СокрЛП(Вхстрока); // п.1 разобьем строку на слова, по пробелу Пока Найти(ВыхСтрока," ")>0 цикл СтрЗаменить(ВыхСтрока," "," "); // заодно уберем лишние пробелы КонецЦикла; стрТемп = СтрЗаменить(ВыхСтрока, " ", РазделительСтрок); ВыхСтрока = ""; // п.2 цикл по словам, сразу заменяем и вставляем в выходную строку Для х = 1 По СтрКоличествоСтрок(стрТемп) Цикл Слово = СтрПолучитьСтроку(стрТемп,х); Если стрДлина(Слово) <= трбКолВо Тогда ВыхСтрока = ВыхСтрока + Слово + " "; Продолжить; КонецЕсли; КолВоЗаглБуквПодряд = КолВоЗаглБуквПодряд(Слово, трбКолВо); Если КолВоЗаглБуквПодряд > трбКолВо Тогда Слово = ВРег(Лев(Слово, 1)) + НРег(Сред(Слово,2)); // первая загл, остальные прописные КонецЕсли; ВыхСтрока = ВыхСтрока + Слово + " "; КонецЦикла; Сообщить(ВыхСтрока); Возврат СокрЛП(ВыхСтрока); КонецФункции //---------------------------------------------------------------------------- |
|||
35
1dvd
28.10.13
✎
09:19
|
(34)
ошибочка |
|||
36
1dvd
28.10.13
✎
09:19
|
Если КолВоЗаглБуквПодряд > трбКолВо Тогда
Слово = ВРег(Лев(Слово, 1)) + НРег(Сред(Слово,2)); // первая загл, остальные прописные КонецЕсли; ВыхСтрока = ВыхСтрока + Слово + " "; Два раза слово будет добавляться |
|||
37
1dvd
28.10.13
✎
09:20
|
(36) (35) сторно
всё правильно |
|||
38
BalBess
28.10.13
✎
09:21
|
проверял на SAMSUNG sAMSUNG SAMSUNg
везде заменяет на Samsung, как мне и надо Всем спасибо! за советы и помощь |
|||
39
Песец
28.10.13
✎
09:22
|
(34) Если КолвоПодряд > трбКолВо Тогда шест букв получается
|
|||
40
BalBess
28.10.13
✎
09:23
|
PS интеграция товаров на сайт, а сайт не брал товары с наименованием БОЛЕЕ 5 заглавных букв подряд
|
|||
41
Wobland
28.10.13
✎
09:25
|
(38) и за тестирование
Сообщить(ПреобразоватьНаименование("САМСУНГ")); ---- САМСУНГ САМСУНГ |
|||
42
Wobland
28.10.13
✎
09:26
|
плюс синтаксические ошибки по мелочи
|
|||
43
Wobland
28.10.13
✎
09:27
|
вот ещё. наслаждайся
Процедура КнопкаВыполнитьНажатие(Кнопка) Сообщить(ПреобразоватьНаименование("Самсунг")); Сообщить(ПреобразоватьНаименование("сАМСУНг")); Сообщить(ПреобразоватьНаименование("САМСунг")); Сообщить(ПреобразоватьНаименование("СамсУнГ")); Сообщить(ПреобразоватьНаименование("СаМСУНГ")); Сообщить(ПреобразоватьНаименование("САМСУНГ")); КонецПроцедуры ---- Самсунг сАМСУНг САМСунг СамсУнГ СаМСУНГ САМСУНГ |
|||
44
1dvd
28.10.13
✎
09:28
|
(40) >>сайт не брал товары с наименованием БОЛЕЕ 5 заглавных букв подряд
нафига такой сайт нужен? |
|||
45
BalBess
28.10.13
✎
09:35
|
(41) у меня
Сообщить(ПреобразоватьНаименование("САМСУНГ")); выдает "Самсунг", как и должно быть (43) все правильно!. Еще раз. Более 5 заглавных символов подряд |
|||
46
BalBess
28.10.13
✎
09:37
|
(42) какие еще синтаксические ошибки? речь про 1с77
у меня все работает, код скопирован с конфигуратора (44) требования сайта (аукцион), чтобы не "пестрили" лоты |
|||
47
Мелкая нечисть
28.10.13
✎
09:52
|
офтоп... прописные буквы - это большие и есть. Маленькие называются строчными :-)
|
|||
48
1dvd
28.10.13
✎
09:56
|
Прописные заменить на заглавные исключая большие кроме высоких
|
|||
49
Песец
28.10.13
✎
10:02
|
(46) ну а какогох тогда в теме вэ8?! И что возвращает "сАМСУНг", т. е. когда ровно пять букв.
|
|||
50
BalBess
28.10.13
✎
10:15
|
(49) про тему извиняюсь, вроде v7 нажимал..
если "сАМСУНг", не трогает, т.е. 5 загл. букв но такие случаи редкие, это уже тема другого ТЗ |
|||
51
Infsams654
28.10.13
✎
10:29
|
(47) +100 Прописной буквой называется заглавная буква в предложении. Маленькая буква того же шрифта называется строчной
|
|||
52
Wobland
28.10.13
✎
10:35
|
а что оно скажет по поводу сAМСУНг?
|
|||
53
Wobland
28.10.13
✎
10:44
|
кстати, а СтрЗаменить в семёрке - тоже функция?
|
|||
54
BalBess
28.10.13
✎
10:44
|
(52) я же писал, ничего не сделает, моя задача, чтобы работала выгрузка на сайт, а если менеджеры заводят товар "сAМСУНг", то это не мои проблемы, пусть исправляют в 1с, или на сайте такой товар будет
(47) все верно, я ввел в заблуждение, везде где я писал "прописная" надо заменить на "строчная", короче стрЗаменить(ВесьТекст, "прописная", "строчная") |
|||
55
Wobland
28.10.13
✎
10:46
|
странно это всё. задача - чтоб работала выгрузка. откуда возник (0)?
|
|||
56
samozvanec
28.10.13
✎
10:48
|
проставить везде первую прописной остальные строчными, если слово без цифр и символов предлагали уже?
|
|||
57
Wobland
28.10.13
✎
10:50
|
(56) да
|
|||
58
Vyachelsv
28.10.13
✎
10:51
|
Если Стр = "SAMSUNG" тогда
Стр = "Samsung"; КонецЕсли; |
|||
59
BalBess
28.10.13
✎
11:00
|
(55) не вижу ничего странного. В базе 1С товар "Ноутбук SAMSUNG 300V5A", для выгрузки нужно чтобы в наименовании товара было не более 5 загл букв подряд, иначе этот товар не появится на сайте. Это требования сайта (сайт не наш). Чтобы не переименовывать несколько тысяч товаров, проще в обработке поменять имя и все.
(56) не вариант, например SONY, ASUS оставляем как есть |
|||
60
Godofsin
28.10.13
✎
11:01
|
(58) Супер!
|
|||
61
BalBess
28.10.13
✎
11:02
|
(56) плазменный телевизор samsung, получится
"Плазменный Телевизор Samsung" |
|||
62
Песец
28.10.13
✎
11:03
|
(50) а, туплю, пять букв не надо менять. Но все равно читабельнее если функция будет возвращать не кол-во букв, а 1 или 0, т. е. надо или не надо преобразовывать.
|
|||
63
Wobland
28.10.13
✎
11:05
|
(59) тычу пальцем в странное
1) это не мои проблемы, пусть исправляют в 1с, или на сайте такой товар будет 2) не более 5 загл букв подряд, иначе этот товар не появится на сайт |
|||
64
Галахад
гуру
28.10.13
✎
11:07
|
(58) Кстате, вполне нормальное решение.
Забацать справочник "Бренды" и если нашел в нем, что Самсунг. |
|||
65
samozvanec
28.10.13
✎
11:13
|
(59) ну и на длину строки проверяй + к (56)
|
|||
66
BalBess
28.10.13
✎
11:28
|
(64) а если будет "НОУТБУК САМСУНГ"
Вот пример с реальной базы: "СНЕГОУБОРЩИК SNAPPER H924RX GROSS TORQUE", а торговая марка у него SIMPLICITY. И что? Мне список ключевых слов составлять, из нескольких тысяч.. У каждого своя задача.. , я для себя сделал просто думал через регулярки сделать, поэтому обратился на форум |
|||
67
1dvd
28.10.13
✎
11:31
|
(66) GROSS останется как есть. Это ж некрасиво
|
|||
68
BalBess
28.10.13
✎
11:50
|
(67) мне не до красоты, лишь бы товар появился на сайте. К тому же можно вызвать процедуру ПреобразоватьНаименование(Наименование, 4) и будет "красиво"!
Откройте например http://www.avito.ru/vologda?q=ноутбук увидете, что я пытался всем объяснить. Т.е. нет более 5 загл. букв подряд. Возьмите свою базу и выгрузите ее на сайт. Все станет ясно )) |
|||
69
BalBess
28.10.13
✎
11:59
|
Кстати вкралась таки обшибка. Вместо
Пока Найти(ВыхСтрока," ")>0 цикл СтрЗаменить(ВыхСтрока," "," "); // заодно уберем лишние пробелы КонецЦикла; заменить на Пока Найти(ВыхСтрока," ")>0 цикл ВыхСтрока = СтрЗаменить(ВыхСтрока," "," "); // заодно уберем лишние пробелы КонецЦикла; |
|||
70
Wobland
28.10.13
✎
12:00
|
(69) до сих пор ни разу не нажал на Сохранить? или семёрка настолько тупая, что молчит?
|
|||
71
BalBess
28.10.13
✎
12:22
|
(70) семерка молчит, и восьмерка молчала бы. Любую функцию можно использовать как процедуру, просто игнорируя возвращаемое значение.
обработка работала... пока не попался товар с двумя пробелами в наименовании, она зависала в бесконечном цикле. |
|||
72
Песец
28.10.13
✎
12:24
|
(71) Восьмерка не молчит, семерка тупая.
|
|||
73
Wobland
28.10.13
✎
12:25
|
(71) восьмёрка настраивается
{Форма.Форма1.Форма(1,12)}: Встроенная функция может быть использована только в выражении. (СтрЗаменить) СтрЗаменить<<?>>("", "", ""); (Проверка: Сервер) {Форма.Форма1.Форма(1,12)}: Встроенная функция может быть использована только в выражении. (СтрЗаменить) СтрЗаменить<<?>>("", "", ""); (Проверка: Тонкий клиент) |
|||
74
svartemov
31.10.13
✎
06:21
|
(0)
(66) //Лови: ВходнаяСтрока = "СНЕГОУБОРЩИК SNAPPER H924RX GROSS TORQUE"; ШаблонПоиска = "(?=.*[\W])(?=[А-Яа-яA-Za-z]*[А-ЯA-Z]{5,})([^\s])([^\s]*)"; Попытка ScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl"); ScrptCtrl.Language = "JScript"; ScrptCtrl.AddCode(" |function Replacer(text, pattern) |{ |return text.replace(new RegExp(pattern,'mg'), function(str, p1, p2){return p1.toUpperCase() + p2.toLowerCase();}); |} |"); СтрокаРезультата = ScrptCtrl.Run("Replacer", ВходнаяСтрока, ШаблонПоиска); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; //Пиво пью |
|||
75
zak555
31.10.13
✎
09:52
|
(34) > Если ((КодСим >= 65) И (КодСим <= 90)) ИЛИ ((КодСим >= 192) И (КодСим <= 223)) Тогда
1. в utf8 коды другие 2. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |