Поиск англ букв в строке

1. Intercititude 16.09.20 12:41 Сейчас в теме
Добрый день всем!
ОФ 8.2

Есть строки такого формата: машина // car , яблоко // apple.

Как вывести раздельно строку на русском и на латинице ?
То есть: 1) машина 2) car ; две строки.
Отсечение строк не подойдёт, ибо у всех реквизитов разная длин наименовании.

Может есть какая-либо функция поиска и вывода латиницы, и наоборот ?
Вознаграждение за ответ
Показать полностью
Найденные решения
2. FatPanzer 16.09.20 12:48 Сейчас в теме +0.3 $m
Посимвольный перебор и сравнение символа со строкой символов латиницы или кириллицы...
	КириллическиеСимволы = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЫыЪ­ъЭэЮюЯя";
	ЛатинскиеСимволы         = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";

	Для НомерСимвола = 1 По ОбщаяДлинаТекста Цикл
		
		ТекущийСимвол = Сред(ИсходныйТекст, НомерСимвола, 1);
		
		Если СтрНайти(КириллическиеСимволы , ТекущийСимвол) <> 0 Тогда
			КириллическийТекст = КириллическийТекст + ТекущийСимвол;
		ИначеЕсли СтрНайти(ЛатинскиеСимволы, ТекущийСимвол) <> 0 Тогда
			ЛатинскийТекст = ЛатинскийТекст + ТекущийСимвол;
		КонецЕсли;
		
	КонецЦикла;

Показать
alex-l19041; darkultro37; +2 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
4. Азбука Морзе 88 16.09.20 12:56 Сейчас в теме
(1) Очевидно же - до двойного слеша на русском, после на английском, разделитель паттерна - запятая.)
5. FatPanzer 16.09.20 12:59 Сейчас в теме
(4) Это игра на предположениях. Предположениями пусть искусственный интеллект занимается. А в суровых реалиях строки "ручками набивают девочки и мальчики", и для получения корректного результат нужен качественный перебор.
А попытки экстраполировать видимые два примера на миллион невидимых - это вероятностная лотерея )))
alex-l19041; +1 Ответить
7. Азбука Морзе 88 16.09.20 13:04 Сейчас в теме
(5) В том то и дело. Напишите слово "сосна" латинскими буквами.
8. Release 16.09.20 13:07 Сейчас в теме
(7) cocna (cocha) <> сосна, cocka ~ соска, cepa = сера.
13. FatPanzer 16.09.20 13:18 Сейчас в теме
(8) СОСНА (COCHA), СОСКА(COCKA), СЕРА(CEPA).
14. Release 16.09.20 13:18 Сейчас в теме
(13) Это частный случай с написанием в верхнем регистре, на что я и указал.
15. FatPanzer 16.09.20 13:22 Сейчас в теме
(14) Решение задачи должно подходить для всех случаев. А не только для логически и визуально кажущихся правильными ))
19. Release 16.09.20 13:30 Сейчас в теме
(15) Разве я, что-то упоминал по поводу метода решения в данном контексте? Я лишь привел пример на предложение:
(7)
Напишите слово "сосна" латинскими буквами.

(16)
Только 8.2 уже в гробу вместе с обычными формами...

Смело, если смотреть на используемые до сих пор конфигурации. Я уж молчу о 7.7.
20. starik-2005 2202 16.09.20 13:30 Сейчас в теме
(19) это не мешает им доживать свое. Не видел новых внедрений на старых конфигурациях.
26. Release 16.09.20 13:36 Сейчас в теме
(20) "им доживать свое" <> "уже в гробу", по крайней мере в моем понимании.
Я бы понял, если бы ими действительно пользовались "последние 3 калеки".
Есть множество крупных организаций, которые до сих пор используют конфигурации на обычных формах, ибо в них есть куча накопившихся за годы доработок, которые так просто скопом в новую конфу не перенести.
alex-l19041; +1 Ответить
28. starik-2005 2202 16.09.20 13:44 Сейчас в теме
(26)
"им доживать свое" <> "уже в гробу", по крайней мере в моем понимании.
И такое бывает. ПО - это очень быстро развивающаяся штуковина. Если нет новых внедрений, а старые доживают свое, то вряд ли такое ПО можно назвать "живым". Это как офис 97, который еще где-то, полагаю. используется, но никто не будет ставить его на новый компьютер.

По поводу 8.2, то люди не переходят с решений на ней на 8.3 только потому, что они не уверены, что режим совместимости, реализованный платформой, будет работать правильно. Но они таким образом и конфигурацию уже давно не обновляют, т.к. современные решения (последние обновления даже УПП 1.3, которая еще поддерживается, но уже опубликовано сообщение о снятии с поддержки) требуют определенных версий платформы. А основная часть конфигураций на обычных формах уже снята с поддержки, что уж там говорить о 8.1 или 7.7. Сложно при таком положении назвать данные продукты "живыми". Они не растут, не размножаются, не эволюционируют - да, можно назвать их "живыми трупами", но не более..
9. FatPanzer 16.09.20 13:08 Сейчас в теме
(7) Я вам совсем о другом. Вы пытаетесь построить решение на поиске закономерностей видимых исходных данных, и предположить, что невидимы вами данные построены на тех же закономерностях.
Однако в задаче вам никто не говорил, что это строгий формат данных и он используется всегда.
К тому же автор ясно дал понять - ему надо определить латиницу. А не предположить визуально (к вопросу о сосне).
11. Release 16.09.20 13:14 Сейчас в теме
(9) автор вообще не дал понять, каков должен быть результат, хотя бы исходя из предоставленного примера.
В качестве примера приведена одна строка или две? Как минимум, что делать с возможными разделителями, запятыми пробелами и т.п.?
2. FatPanzer 16.09.20 12:48 Сейчас в теме +0.3 $m
Посимвольный перебор и сравнение символа со строкой символов латиницы или кириллицы...
	КириллическиеСимволы = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЫыЪ­ъЭэЮюЯя";
	ЛатинскиеСимволы         = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";

	Для НомерСимвола = 1 По ОбщаяДлинаТекста Цикл
		
		ТекущийСимвол = Сред(ИсходныйТекст, НомерСимвола, 1);
		
		Если СтрНайти(КириллическиеСимволы , ТекущийСимвол) <> 0 Тогда
			КириллическийТекст = КириллическийТекст + ТекущийСимвол;
		ИначеЕсли СтрНайти(ЛатинскиеСимволы, ТекущийСимвол) <> 0 Тогда
			ЛатинскийТекст = ЛатинскийТекст + ТекущийСимвол;
		КонецЕсли;
		
	КонецЦикла;

Показать
alex-l19041; darkultro37; +2 Ответить
10. Release 16.09.20 13:10 Сейчас в теме
(2) Я бы, наверное, реализовал через КодСимвола и диаппазоны этих кодов, должно быть несколько быстрее.
12. FatPanzer 16.09.20 13:16 Сейчас в теме
(10) Согласен, но так нагляднее. В любом случае основное здесь - это полный перебор символов и их анализ.
А сам метод определения того - латинский это символ или кришнаитский - просто вопрос религии ))
25. Intercititude 16.09.20 13:35 Сейчас в теме
(12)Пользуясь случаем, на ход ноги так сказать.

Подскажите возможно:
Есть типовая обработка "Подбор номенклатуры" 8.1
У неё есть ТабличнаяЧасть - НоменклатураДляПодбора.
Я на форме в тч добавил свою колонку, но в режиме предприятия её не видно и в "Настройка списка" так же отсуствтует.

Собственно где в коде это управляется ?
44. SlavaKron 16.09.20 17:16 Сейчас в теме
(10)
должно быть несколько быстрее
медленнее
Следующий код выполняется ~670 мс:
ЛатинскиеСимволы = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
Для Сч = 1 По 1000000 Цикл ЭтоЛатиница = Найти(ЛатинскиеСимволы, "Я") > 0 КонецЦикла;

Следующий код выполняется ~1120 мс:
Для Сч = 1 По 1000000 Цикл Код = КодСимвола("Я"); ЭтоЛатиница = (Код >= 65 И Код <= 90) ИЛИ (Код >= 97 И Код <= 125) КонецЦикла
45. Release 16.09.20 19:35 Сейчас в теме
(44) Набросал код для более объективного теста:
&НаКлиенте
Процедура Вариант1(_Символы)
	ТекДата = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	ЛатинскиеСимволы = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
	
	Для Сч = 1 По 1000000 Цикл
		Позиция = Найти(ЛатинскиеСимволы, _Символы[Сч - 1]);
		ЭтоЛатиница = Позиция > 0
	КонецЦикла;
	
	Сообщить("Вариант 1: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - ТекДата) + "мс");
КонецПроцедуры

&НаКлиенте
Процедура Вариант2(_Символы)
	ТекДата = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	Для Сч = 1 По 1000000 Цикл
		Код = КодСимвола(_Символы[Сч - 1]);
		ЭтоЛатиница = (Код >= 65 И Код <= 90) ИЛИ (Код >= 97 И Код <= 125);
	КонецЦикла;
	
	Сообщить("Вариант 2: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - ТекДата) + "мс");
КонецПроцедуры

&НаКлиенте
Процедура Тест(Команда)
	ГСЧ = Новый ГенераторСлучайныхЧисел(1000000);
	
	Для НомерПопытки = 1 По 3 Цикл
		_Символы = Новый Массив;
		
		Для Сч = 1 По 1000000 Цикл
			_Символы.Добавить(Символ(ГСЧ.СлучайноеЧисло(1, 200)));
		КонецЦикла;
		
		Вариант1(_Символы);
		Вариант2(_Символы);
	КонецЦикла;
КонецПроцедуры
Показать

Получилось так:
Вариант 1: 10 033мс
Вариант 2: 9 364мс
Вариант 1: 9 145мс
Вариант 2: 9 361мс
Вариант 1: 9 078мс
Вариант 2: 9 323мс

Но меня удивило, что множественное условие "(Код >= 65 И Код <= 90) ИЛИ (Код >= 97 И Код <= 125)" отрабатывает так медленно, сопоставимо с функцией "Найти(ЛатинскиеСимволы, _Символы[Сч - 1])". А с "КодСимвола(_Символы[Сч - 1])" работает еще медленнее, что вообще странно.
Прикрепленные файлы:
46. FatPanzer 16.09.20 19:52 Сейчас в теме
(45) Видимо потому что КодСимвола() - это фактически точно такой же поиск перебором в системной таблице символов.
47. Release 16.09.20 20:02 Сейчас в теме
(46) Либо идет преобразование из Unicode в ASCII, что-то вроде использования "WideCharToMultiByte()" из WinAPI. А потом уже получение его кода.
33. Intercititude 16.09.20 14:56 Сейчас в теме
34. FatPanzer 16.09.20 15:01 Сейчас в теме
(33) Это в Синтакс-помощнике.
35. Release 16.09.20 15:03 Сейчас в теме
(34) Думаю вопрос был в этом (из СП):
СтрНайти (StrFind)
Доступен, начиная с версии 8.3.6 (в режиме совместимости с версией 8.3.6 и последующими).

В (1) "ОФ 8.2".
Intercititude; +1 Ответить
36. FatPanzer 16.09.20 15:06 Сейчас в теме
(35) А, вон чо...
А что там в 8.2 было? Просто Найти() вроде бы...
37. Intercititude 16.09.20 15:06 Сейчас в теме
(36) Да, понял. Спасибо. Вот к чему приводит разработки на 8.1 и 8.2 в большей степени..
38. Release 16.09.20 15:10 Сейчас в теме
(36) Да, Найти() и два параметра, вместо пяти. Но в указанном примере их хватает.
39. Intercititude 16.09.20 15:12 Сейчас в теме
(36) Преобразование значения к типу число не может быть выполнено. Кирилический текст это что?
upd. разобрался..
3. headMade 143 16.09.20 12:50 Сейчас в теме
не совсем понял какой нужен конечный результат, но

СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок или СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов
а затем
СтроковыеФункцииКлиентСервер.ТолькоЛатиницаВСтроке
ipoloskov; +1 Ответить
6. Азбука Морзе 88 16.09.20 13:01 Сейчас в теме
(3) лучше использовать функцию глобального контекста: СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>)
29. Sashares 18 16.09.20 13:53 Сейчас в теме
16. starik-2005 2202 16.09.20 13:23 Сейчас в теме
Результат = СтрРазделить(СтрокиСоСловами, "/,", Ложь);
Флаг = Ложь;
Русское = "";
Для Каждого Ст ИЗ Результат Цикл
  Если Флаг Тогда Сообщить(СтрШаблон("%1 = %2", Русское, Ст)
            Иначе Русское = Ст
  КонецЕсли;
  флаг = не флаг;
КонецЦикла; 
Показать

Будет выведено что-то типа
Машина = Car
Яблоко = Apple


В 8.2. для этих функций есть БСП, методами которой можно воспользоваться. Только 8.2 уже в гробу вместе с обычными формами, поэтому я даже не подскажу, какими точно, но они отличаются от приведенных выше.

Но вообще в 1С есть многоязыковые строки.
17. FatPanzer 16.09.20 13:28 Сейчас в теме
(16) Не вводите в заблуждение. В 8.2 нет БСП. И даже в 8.3 нет. Больше скажу - и в 8.5 БСП тоже не планируется.
18. starik-2005 2202 16.09.20 13:29 Сейчас в теме
(17) никто и не говорит что в 8.2 есть БСП. Читайте внимательно.
21. FatPanzer 16.09.20 13:32 Сейчас в теме
(18) Странно, кто бы мог это сказать тогда?
Прикрепленные файлы:
22. starik-2005 2202 16.09.20 13:33 Сейчас в теме
(21) для тех, кто не способен включить мозг, иногда что-то может показаться. Как в трудах Канта для человека, который плохо ориентируется в языковых возможностях и смысле, который язык оставляет в тексте.
23. sam441 150 16.09.20 13:33 Сейчас в теме
Автор, вообще мастер постановки задач, что в итоге ему конкретно нужно уже додумывают сами, может ему вообще нужно тупо отделить русские слова от английских, или наоборот, если так, то можно посмотреть в сторону регулярок, например, выражение для поиска английских слов: [a-zA-Z]+
24. SlavaKron 16.09.20 13:33 Сейчас в теме
Лучше воспользоваться всё же разделителями – на практике наименования чего бы то ни было на русском языке могут содержать латинские символы: бренды, маркировки, размеры и т.п.
27. FatPanzer 16.09.20 13:40 Сейчас в теме
(24) Насколько я понимаю автора - это теоретическая задача на умение работать со строками. А не прикладная. Да, он упоминает про реквизиты наименования, но все равно практический смысл в задаче отсутствует напрочь. В том числе по той же причине, которую вы и указываете.
Предполагаю, конечно, что вопрос стоит в необходимости мультиязычности данных. Но вряд ли это решается через разбиение наименования...
30. Release 16.09.20 14:00 Сейчас в теме
(27) Автор, вообще, молча отказывается что-либо комментировать.
Только задает вопросы не по первоначальной теме (как в чате), вместо того, чтобы следовать правилам и создать отдельную по интересующему вопросу.

(28) Последнее сообщение по поводу УПП, которое я видел, собираются и дальше поддерживать. Как раз по причине, что еще достаточно большое количество организаций ее использует.
Что касается версий платформ, то в моем понимании, они являются "живыми" пока их использует большое количество пользователей, пусть даже и в режиме совместимости. Т.е. 7.7, ну да, можно назвать "полумертвым", 8.1 "отмирающим" видом, а вот 8.2 я бы поостерегся еще, так называть. Есть куча отраслевых решений, которые основаны на 8.2 (обычные формы, перетекшие из 8.1) и до сих пор поддерживаются (обновляются), пусть и в режиме совместимости платформы.
Как по мне, это так же, как назвать "(живыми) трупами" всех пенсионеров - большинство не растет, не размножается и уж точно не эволюционирует.
31. starik-2005 2202 16.09.20 14:08 Сейчас в теме
(30)
Как по мне, это так же, как назвать "(живыми) трупами" всех пенсионеров
Ну так государство, и, особенно, пенсионные фонды, которые на этих отраслевых решениях работают (хотя наше давно уже на базе БП 3.0), к пенсионерам примерно так и относятся. активно ожидая вестей о безвременной кончине клиента (у них там модели статистически по срокам дожития - будь здоров, а реклама алкоголя и табака - одна из основных строк расходов).
32. Release 16.09.20 14:19 Сейчас в теме
(31) Но ведь даже они не делают, по крайней мере публично, таких заявлений. Я именно об этом. Для себя лично, у каждого может быть свое мнение.
40. starik-2005 2202 16.09.20 15:19 Сейчас в теме
(32)
Но ведь даже они не делают, по крайней мере публично, таких заявлений.
Если они сделают такое заявление, то за них перестанут голосовать, а пенсионеры - это значительная часть голосующего электората.
41. kozorez 7 16.09.20 15:37 Сейчас в теме
Можно регулярными выражениями, будет быстрее и точнее. Главное подобрать шаблон под свою задачу.
RegExp = Новый COMОбъект("VBScript.RegExp");// создаем объект для работы с регулярными выражениями
RegExp.MultiLine = Истина;  // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина;     // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске

Шаблон = .........; //шаблон проверки

RegExp.Pattern = Шаблон;    // шаблон (регулярное выражение)


Если Не RegExp.Test(ПроверяемаяСтрока) Тогда
    
КонецЕсли;
Показать
42. Release 16.09.20 15:42 Сейчас в теме
(41) автор с трудом СтрНайти() осваивает, а вы ему COMОбъект-ы, регулярные выражения...
Intercititude; +1 Ответить
43. kozorez 7 16.09.20 15:46 Сейчас в теме
(42) Ну с COMОбъектом можно просто скопировать... а регулярки нужно регулярно курить :)
Зато 1-работает быстро,
2-задачу автора решает спокойно,
3-на будущее куча возможностей.
48. Vortigaunt 82 16.09.20 23:19 Сейчас в теме
(41) Регулярки - сила. Для вдумчивого курения советую добавить себе в закладки сайт: https://regex101.com/
Это онлайн отладчик регулярных выражений. Красиво, цветом подсвечивает совпадения и т.п. Решал задачу поиска телефонных номеров в комментариях - этот сайт просто выручил.
49. starik-2005 2202 18.09.20 12:57 Сейчас в теме
(48) notepad++, любой редактор под лынукс, ...
50. -AI- 18.09.20 21:42 Сейчас в теме
предложу свой вариант...
КириллическиеСимволы = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЫыЪъЭэЮюЯя";
ЛатинскиеСимволы = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";	
	
ЛатинскийТекст = СтрСоединить(СтрРазделить(Строка,КириллическиеСимволы+" ",Ложь)," ");
КириллическийТекст = СтрСоединить(СтрРазделить(Строка,ЛатинскиеСимволы+" ",Ложь)," ");
не 8.2, конечно, но вдруг кому действительно надо...
Оставьте свое сообщение
Вопросы с вознаграждением