Регулярные выражения без внешних компонент? Легко!

04.03.16

Разработка - Механизмы платформы 1С

Сложный способ организовать проверку строки с помощью регулярного выражения в 1С. При этом ни одна внешняя компонента не пострадала. Ну и от платформы (Linux, MustDie) - не зависит.

Здравствуйте, товарищи! 

Дабы не затягивать, сразу приведу код. Кто хочет разобраться, в чем тут, собственно, дело, пусть читает статьи по XDTO. О регулярных выражениях расскажу ниже, но статей на эту тему и так масса.

Код:

&НаКлиенте
Функция ПроверитьСтроку(Строка, Фасет)
	Чтение = Новый ЧтениеXML;
	Чтение.УстановитьСтроку(
				"<Model xmlns=""http://v8.1c.ru/8.1/xdto"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""Model"">
				|<package targetNamespace=""sample-my-package"">
				|<valueType name=""testtypes"" base=""xs:string"">
				|<pattern>" + Фасет + "</pattern>
				|</valueType>
				|<objectType name=""TestObj"">
				|<property xmlns:d4p1=""sample-my-package"" name=""TestItem"" type=""d4p1:testtypes""/>
				|</objectType>
				|</package>
				|</Model>");

	Модель = ФабрикаXDTO.ПрочитатьXML(Чтение);
	МояФабрикаXDTO = Новый ФабрикаXDTO(Модель);
	Пакет = МояФабрикаXDTO.Пакеты.Получить("sample-my-package");
	Тест = МояФабрикаXDTO.Создать(Пакет.Получить("TestObj"));

	Попытка
		Тест.TestItem = Строка;
		Возврат Истина
	Исключение
		Возврат Ложь
	КонецПопытки;
	
КонецФункции
	
&НаКлиенте
Процедура Модель(Команда)
	
	Сообщить(ПроверитьСтроку("01.01.2012","\d{2}\.\d{2}\.\d{4}"));
	Сообщить(ПроверитьСтроку("01.01.20121","\d{2}\.\d{2}\.\d{4}"));
	
КонецПроцедуры

Все.

Для тех, кому мало...

Итак, лет этак эндцать назад программисты решили упростить поиск, замену и проверку на соответвие различных строк, т.к. им, полагаю, надоело каждый раз писать что-то типа:

Если Сред(стрДата,1,1) < "0" ИЛИ Сред(стрДата,1,1) > "9" Тогда Ошибка = Истина;
КонецЕсли;

Если Сред(стрДата,2,1) < "0" ИЛИ Сред(стрДата,2,1) > "9" Тогда Ошибка = Истина;
КонецЕсли;

Если Сред(стрДата,3,1) <> "." Тогда Ошибка = Истина;
КонецЕсли;

//...

В итоге во всех нормальных языках программирования были реализованы библиотеки, содержащие процедуры и функции для работы с регулярными выражениями, и жизнь разработчиков качественно улучшилась, ибо тот монструозный код можно было заменить на куда более простой:

Ошибка = НЕ ПроверитьСтроку(СтрДата, "\d{2}\.\d{2}\.\d{4}");

Да, грамотным разработчикам стало ой как просто. Но что делать остальным? Правилный ответ, конечно, - учиться, учиться и еще раз  учиться! )))

 

Итак, самое простое, что нужно, чтобы освоить шаблоны проверки:

. - любой символ

+ - один или более раз, пример ".+" - один или более любой символ.

* - ноль или более раз, пример ".*" - любое количество любых символов (даже ни одного).

[n-m] - символ от m до n, пример: "[0-9]+" - одна или более цифр(а).

\d - цифра, пример \d+ - одна или более цифр(а).

\D - не цифра.

\s - пробельный символ - ТАБ, пробел, перенос строки, возврат каретки и т.п.

\S - непробельный символ.

\w - буква, цифра, подчеркивание.

\W - не буква, не цифра и не подчеркивание соответственно.

^ - начало текста, например "^\d+" - строка начинается с цифры.

$ - конец текста, например "\D+$" - строка заканчивается НЕ цифрой.

{m,n} - шаблон для от m до n символов, например "\d{2,4}" - от двух до четырех цифр. Можно указать одну и всего цифру для строгого соответвия.

\ - экранирует спецсимволы. Например, "\." - символ точки.

regexp регулярные выражения XDTO

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    3562    dsdred    48    

66

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5032    YA_418728146    25    

62

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6160    dsdred    36    

110

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18196    SeiOkami    46    

116

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    11766    human_new    27    

72

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8555    YA_418728146    6    

139

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6195    sebekerga    54    

93

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15525    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. neuromancer_aza 48 05.03.16 05:54 Сейчас в теме
Здравствуйте. Замеряли скорость работы? Как оно в скорости, например, с тем же VBScript.RegExp?
2. starik-2005 3031 05.03.16 11:20 Сейчас в теме
(1) neuromancer_aza, у меня Linux, поэтому мне непросто ответить на Ваш вопрос, но Вы всегда можете померять это самостоятельно и рассказать нам. Предположу, что медленнее, если не кешировать объект XDTO, но если кешировать, то может быть и быстрее (если надо один шаблон тестить с многими исходными данными)
63. andrey314 14 20.04.18 09:51 Сейчас в теме
(2)

При использовании данным способом шаблона:
ШаблонПоиска = "^\!{0,1}([0-9A-Za-z\*]{9,})&([0-9|\.]{1,})\$";

такая ошибка:


{ОбщийМодуль.ДополнительныеПроцедурыКлиент.Модуль(42)}: Ошибка при вызове метода контекста (ПрочитатьXML)
Модель = ФабрикаXDTO.ПрочитатьXML(Чтение);
по причине:
Ошибка разбора XML: - [4,38]
Фатальная ошибка:
xmlParseEntityRef: no name

Не подскажете как быть в данной ситуации? Подозреваю что причина может быть в символе "&"
64. starik-2005 3031 20.04.18 11:01 Сейчас в теме
(63) 1C, на сколько я помню, не умеет "$" и "^", т.к. для проверки шаблона эти символы не нужны. Попробуйте убрать их из строки.

По поводу "&" - то это символ? На сколько я знаю (и вики - тоже) - амперсанд - это обычный символ, на него ничто ругаться не должно...

ЗЫ: также, возможно Вы зря заэкранировали "!". Т.е. не нужно писать "\!" - нужно просто "!".

ШаблонПоиска = "!{0,1}([0-9A-Za-z\*]{9,})&([0-9|\.]{1,})";
Gang031; 🅵🅾️🆇; andrey314; +3 Ответить
65. andrey314 14 20.04.18 12:59 Сейчас в теме
(64)

Да спасибо.
Действительно, убрал "$" и "^" а вместо "&" использовал '& amp;' и теперь работает.
68. gansik 29.05.18 14:02 Сейчас в теме
(2) Sergey Andreev, а что Вы понимаете под "кэшированием объекта"? Как это правильно реализовать, можно примерчик? Мне как раз нужно проверять много строк на соответствие одному шаблону.
Заранее спасибо!
70. starik-2005 3031 29.05.18 14:51 Сейчас в теме
(68) просто добавьте в функцию параметр "test", а в коде функции строки с созданием объекта оберните в блок Если-Тогда-КонецЕсли, в котором проверяйте условие "test = неопределено". Перед первым вызовом напишите "test = Неопределено" (перед циклом проверки). В итоге у Вас функция будет вызываться только первый раз с пустым объектом XDTO, а в следующий раз уже с заполненным, что приведет к использованию уже созданного объекта, а не созданию нового.
MrFlanker; METAL; aap290680; e.kogan; +4 Ответить
71. gansik 29.05.18 15:32 Сейчас в теме
(70)Спасибо, всё получилось!
69. gansik 29.05.18 14:09 Сейчас в теме
3. pfihr 374 05.03.16 14:17 Сейчас в теме
Прекрасно!
От себя могу только добавить, что есть еще объекты для работы с XPath, это тоже регулярные выражения, но для уже языков разметки, типа html и xml.
Если добавите и их, будет совсем хорошо!
Роман Цованян.
112. kuzyara 1896 14.12.23 06:23 Сейчас в теме
(3) я просто оставлю это здесь
СтрНайтиПоРегулярномуВыражению (StrFindByRegularExpression)
Синтаксис:
СтрНайтиПоРегулярномуВыражению(<Строка>, <РегулярноеВыражение>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>, <ИгнорироватьРегистр>, <МногострочныйПоиск>)
Возвращаемое значение:
Тип: РезультатПоискаПоРегулярномуВыражению.
Описание:
Находит первое вхождение регулярного выражения в исходной строке.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер).
Пример:
Строка = "Roses are #ff0000";
РегулярноеВыражение = "#([a-f0-9]{6})";

РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Строка, РегулярноеВыражение);
Если РезультатПоиска.НачальнаяПозиция <> 0 Тогда
    СтрокаРезультат = СРед(Строка,
        РезультатПоиска.НачальнаяПозиция, РезультатПоиска.Длина);
КонецЕсли;
Использование в версии:
Доступен, начиная с версии 8.3.23.
113. orefkov 1152 14.12.23 09:45 Сейчас в теме
(112)
Тоже просто оставлю это здесь :)
раз:
27 апреля 2023 г. Фирма "1С" извещает пользователей и партнеров о выпуске 27.04.2023 новой версии 8.3.23 платформы


два:
Публикация:
№ 464971
Создание 04.03.16 23:14
Обновление 04.03.16 23:14


Семь лет, ребята, семь лет. Лет через десять, глядишь и скрипты к Конфигуратору будут.
nekit_rdx; +1 Ответить
114. 7OH 69 14.12.23 09:47 Сейчас в теме
(113)
Больше. Много больше.
1.5 года только на доработку того, что просто провтыкали на этапе тестирования взяли.
115. starik-2005 3031 14.12.23 11:29 Сейчас в теме
(112)
СтрокаРезультат = ...
И к чему такие сложности?
СтрокаРезультат = РезультатПоиска.Значение;
4. Поручик 4670 05.03.16 14:22 Сейчас в теме
Оригинально. Интересно, как оно будет работать в цикле.
5. starik-2005 3031 05.03.16 16:42 Сейчас в теме
(4) Поручик, предположу, что если сохранять объект XDTO, то и в цикле будет быстро. Если же каждый раз фабрикой создавать пакет, то. полагаю, при множественном использовании производительность будет не очень.

(3) pfihr, здесь используется встроенная в 1С проверка типа по фасету для значения поля XDTO-объекта, так что, полагаю, добавить сюда ХPath совсем не получится )))
🅵🅾️🆇; PlatonStepan; 1prog@bk.ru; Brawler; +4 Ответить
6. AlX0id 06.03.16 10:34 Сейчас в теме
Круто %)
А какой язык регулярок используется в фасетах?
8. starik-2005 3031 06.03.16 11:01 Сейчас в теме
(6) AlX0id, ИМХО тот же, что и в RegExp от M$.

(7) Xershi, ниже я привел часть синтаксиса с примерами. В коде есть пример для проверки даты: ПроверитьСтроку("01.01.2012","\d{2}\.\d{2}\.\d{4}") - сравните с описанием регулярных выражений ниже по тексту и попробуйте разобрать данный пример. Я сам с регулярками раза с третьего только разобрался, а первые два подхода вызвали лишь мысли о том, что пока мне это не сильно надо, но выглядит как-то сложно и времени потратить надо будет немало, а его, типа, у меня нет. Но когда действительно появилась необходимость в их освоении, то оказалось, что достаточно дня, чтобы разобраться.
9. Xershi 1473 06.03.16 11:23 Сейчас в теме
(8) поэтому и говорю. Было бы не плохо чтобы эту тему разжевали более подробно. Так было бы быстрее освоить материал!
10. starik-2005 3031 06.03.16 11:36 Сейчас в теме
(9) Xershi, быстрее освоить материал - это взять и написать регулярки для тестирования каких-то реальных вещей. Например, даты, e-mail, адреса сайта, имени переменной, числа, почтового адреса с индексом, ... - вот реализуйте каждый из них - и Вы сразу же станете специалистом. Описанной в статье информации для этого уже должно хватить. А если что-то непонятно - всегда есть гугл, он куда терпеливей иных учителей и никогда не отказывает пытливому уму в предоставлении ссылок на искомое.
nekit_rdx; sommid; +2 Ответить
7. Xershi 1473 06.03.16 10:43 Сейчас в теме
Было бы не плохо добавить блок, который бы описывал как на практике это использовать.
А то после прочтения не стало понятнее как это употреблять.
12. webester 26 06.03.16 16:12 Сейчас в теме
(7)Пробегите хотя бы бегло Дж.Фридл - Регулярные выражения. Уйдут все вопросы.
14. Xershi 1473 06.03.16 16:29 Сейчас в теме
(12) webester, если будет задача, я просто погуглю, а пока просто хотел, чтобы улучшили статью, чтобы начинающим не пришлось гуглить)
dvissarov5; AnryMc; +2 Ответить
11. oleshko_alexey 2 06.03.16 15:20 Сейчас в теме
интересно,надо будет проверить скорость работы
13. starik-2005 3031 06.03.16 16:19 Сейчас в теме
Кстати, господа, в notepad++ есть поиск и замена на основе регулярных выражений. Я так иногда на работе что-то искал и менял, чтобы потом в консоль запросов вставить, как список. Вот там как раз непочатый край для экспериментов с регулярными выражениями. Например, попробуйте все даты в тексте заменить на какую-то конкретную дату - уже расширите горизонты своего познания и огребете достаточно экспы для очередного левелапа )))
semagin@gmail.com; dvissarov5; akR00b; LordKim; viking(j); CHSN8; SiAl; +7 Ответить
15. AlX0id 09.03.16 09:16 Сейчас в теме
(13)
Ну уж тогда Regex Buddy можно поставить, для полноты ощущений :)
34. orefkov 1152 05.08.16 15:55 Сейчас в теме
(15) AlX0id, (15) AlX0id, зачем Regex Buddy, когда есть это:
SiAl; artbear; vikad; +3 Ответить
39. alexkon 94 17.01.17 17:03 Сейчас в теме
(34), а где такой редактор взять?
104. pvlunegov 157 10.12.20 07:04 Сейчас в теме
16. maxx 991 09.03.16 12:14 Сейчас в теме
Здорово.
А не подскажете почему в конфигураторе при определении XTDO пакета визуально свойства pattern не видно?
17. starik-2005 3031 09.03.16 12:44 Сейчас в теме
(16) maxx, это свойство есть только у типа данных.
21. maxx 991 09.03.16 16:27 Сейчас в теме
(17) в определении типа тоже не увидел свойства pattern, хотя есть другие свойства фасета (максим. , миним. длины)
22. starik-2005 3031 09.03.16 16:34 Сейчас в теме
(21) maxx, ну, это, ...
Прикрепленные файлы:
18. karapuzzzz 63 09.03.16 14:38 Сейчас в теме
Регулярки это найс. Спасибо огромное автору за хорошую альтернативу внешним компонентам.

А теперь тестирование. За основу взял проверку адреса электронной почты:
Регулярка: "\w+@\w+\.\w+"
Текст проверки 1С:
ПозицияСобаки = Найти(СтрокаАнализа, "@");
		СтрокаПослеСобаки = Сред(СтрокаАнализа, ПозицияСобаки);
		ПозицияТочки =  Найти(СтрокаПослеСобаки, ".");
		
		Если ПозицияСобаки > 1 
			И ПозицияТочки > 1 Тогда
		
			//
		
		КонецЕсли;
Показать


На 100000 итераций код 1С отработал за 2сек, а регулярные выражения 63с
19. starik-2005 3031 09.03.16 15:04 Сейчас в теме
(18) karapuzzzz, а Вы кешировали объект XDTO или выполняли процедуру целиком? У Вас в коде правильным адресом будет и "%;№!@:?*!.", ибо вы не проверяете на "букву, цифру и подчеркивание" - реальный адрес куда сложнее. при том валидный "iem.mycompany@holding.com" не пройдет проверку по регулярке, ибо валидная "." приведет к ошибке. Т.е. не все так просто в действительности )))
pvlunegov; SiAl; +2 Ответить
20. starik-2005 3031 09.03.16 15:31 Сейчас в теме
(18) karapuzzzz, попробовал с кешем объекта XDTO и паттерном "[0-z]+@[0-z]+\.[0-z]+":

Время начала: 63 593 123 364 131
Длительность: 999 мс
Истинных: 100 000
Время начала: 63 593 123 365 130
Длительность: 280 мс

Код какой-то такой получился:
	ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Сообщить("Время начала: " + ВремяНачала);
	Для А = 1 ПО 100000 Цикл 
		Результат = ПроверитьСтроку(ОбъектХ, СтрокаАнализа, "[0-z]+@[0-z]+\.[0-z]+");
		Если Результат Тогда Сч = Сч + 1;
		КонецЕсли;
	КонецЦикла;
	Сообщить("Длительность: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала));
	Сообщить("Истинных: " + Сч);


	ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Сообщить("Время начала: " + ВремяНачала);
	Для А = 1 ПО 100000 Цикл 
	
		Результат = Ложь;
		ПозицияСобаки = Найти(СтрокаАнализа, "@");
        СтрокаПослеСобаки = Сред(СтрокаАнализа, ПозицияСобаки);
        ПозицияТочки =  Найти(СтрокаПослеСобаки, ".");
        
        Если ПозицияСобаки > 1 
            И ПозицияТочки > 1 Тогда
        
            Результат = Истина;
        
		КонецЕсли;
		
	КонецЦикла;
	Сообщить("Длительность: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала));

Показать
Vladimir Litvinenko; +1 Ответить
23. Yashazz 4706 09.03.16 20:26 Сейчас в теме
Класс! Просто фантастика. Круть неимоверная, зачёт однозначный.
Совершенно шикарная идея, и ведь правда работает. Неистово плюсую.

Если не секрет, как до такого додумались? Что натолкнуло?
katyanic; frkbvfnjh; Student1C; +3 Ответить
24. starik-2005 3031 09.03.16 21:52 Сейчас в теме
(23) Yashazz, ну как бы тут было два момента: выгрузка отчета по схеме XSD, любезно предосиавленная ПФР, которая отказалась грузиться в пакет и вынудила исследовать механизм XDTO. Потом была статья на ИС, в которой кто-то реализовал алгоритм регулярок. Я было подумал, а не выгрузить ли мне пакет в модель с прикрученным типом и менять паттерн проверки у этого типа... И, в итоге, сработало как видите...

ЗЫ: про XDTO еще месяц назад ничего толком не знал, а теперь знаю о нем весьма много.
nekit_rdx; DarkUser; anchovy; Дмитрий74Чел; +4 Ответить
49. frkbvfnjh 785 05.09.17 08:38 Сейчас в теме
(24)
ЗЫ: про XDTO еще месяц назад ничего толком не знал, а теперь знаю о нем весьма много.

Если не секрет, что изучали для познания дзен XDTO? Сам толком не вкурил эту тему, но очень хочется досконально в этом разбираться...
50. starik-2005 3031 05.09.17 08:52 Сейчас в теме
(49)
Если не секрет, что изучали для познания дзен XDTO?
"Чтобы в чем-то разобраться нужна задача и сержант с сапогом, периодически пинающим под зад" (Я)

Исходя из вышесказанного могу порекомендовать статьи "ХДТО - это просто" на Инфостарте (серия из трех статей, если не ошибаюсь - оттуда, в частности, почерпнута идея о сериализации модели). Ну и сержанта Вам с сапогом ))))

Кстати, у меня друг один все заставлял меня с регулярками разобраться - я болт забивал после прочтения пары строк из Вики. Но когда внезапно появилась задача, то я не только за день с ними вполне себе разобрался, но и написал механизм преобразования 1С-ной маски поля в регулярное выражение. правда тогда проверка была реализована на мелкософтовское регэкспе, но бывали случаи, когда СОМ тупо отваливался (баги нескольких платформ) и при инициализации любого СОМ-объекта система валилась с ошибкой. Исходя из этого мысль о реализации теста регулярок средствами платформы постоянно висела в голове. И как только я узнал, что в типах ХДТО есть возможность использовать паттерны проверки, то это сразу же материализовалось в вышеприведенный код.
51. frkbvfnjh 785 05.09.17 08:58 Сейчас в теме
(50)
при инициализации любого СОМ-объекта система валилась с ошибкой.

У меня та же фигня... Спасибо за наводку!
52. starik-2005 3031 05.09.17 08:58 Сейчас в теме
(51)
У меня та же фигня... Спасибо за наводку!
Решалось рестартом сервера приложений. Также проблема появляется при одновременной инициализации на сервере СОМ-объекта несколькими сеансами/потоками. Решение описал тут.
54. PavleG29 05.09.17 09:31 Сейчас в теме
(50)
Но когда внезапно появилась задача, то я не только за день с ними вполне себе разобрался, но и написал механизм преобразования 1С-ной маски поля в регулярное выражение.

Я даже помню, в какой организации это было :-)

Тоже потребовалось добавить проверку с помощью регулярок, но на Linyx регэксп уже не помог. Спасибо за рабочий пример и большой привет со старой работы!
55. starik-2005 3031 05.09.17 09:35 Сейчас в теме
(54)
Я даже помню, в какой организации это было :-)
Ну тогда ты должен знать, почему я тогда в ХДТО ничего не понимал! ))) (потому что сержант пинал Диму, а не меня)

ЗЫ: Тоже всем привет!
25. fvadim 9 10.03.16 11:03 Сейчас в теме
я правильно понимаю, что этот метод годится только для проверки на соответствие шаблону и получение сабматчей реализовать не получится?
26. tormozit 7132 10.03.16 11:06 Сейчас в теме
Проверка паттерна конечно полезна. Но например в ИР соотношение проверки паттерна и поиска по паттерну составляет 1:100. Поэтому название публикации не совсем корректное. Корректнее было бы "Проверка регулярного выражения без внешних компонент? Легко!"
Release; kuza2000; katyanic; NikeeNik; pm74; herfis; zqzq; myjob1c; _also; borrman; Fragster; +11 Ответить
105. tormozit 7132 23.04.21 13:51 Сейчас в теме
(26) За 5 лет автор так и не скорректировал название статьи. Все ради просмотров или почему? Люди ведутся на многообещающее название - читают и обламываются. Статья полезная, но название обещает явно больше чем статья может предложить. Надеюсь автор все таки пересмотрит название.
106. starik-2005 3031 23.04.21 13:52 Сейчас в теме
(105)
Надеюсь автор все таки пересмотрит название.
Зачем? Меня Ваши аргументы не убедили. В аннотации написано только о проверке и независимости от платформы. Ровно это статья и излагает. Другого кейса для использования в 1С регулярных выражений без внешних компонент на настоящий момент не существует.
Crazy_Max; Symbiat; +2 Ответить
107. 7OH 69 24.04.21 11:56 Сейчас в теме
(105) согласен.
Раз в год ищу и каждый раз сюда попадаю с надеждой.
А тут только проверка - облом
108. starik-2005 3031 24.04.21 12:30 Сейчас в теме
(107) и как предлагаете назвать статью? Проверка на паттерн с помощью рнгулярного аыражения в 1С без внешних компонеет? Ну и через год найдете, подумаете, что может и не паттерн, залезите, а тут опять только паттерн. Нифига не поменяется кроме того, что яндекс ее выше повесит.
27. Fragster 1137 10.03.16 11:34 Сейчас в теме
Проверка - замечательно. Но часто нужна замена и/или данные по началу и длине найденных фрагментов (опять же, их может быть более одного)
28. starik-2005 3031 10.03.16 12:29 Сейчас в теме
(27) Fragster, 1с использует в своем коде библиотеку icu - в ней все это, на сколько я знаю, есть. Что мешает им реализовать все это в языке - для меня загадка. Поэтому без внешних компонент только проверка.
29. starik-2005 3031 10.03.16 12:42 Сейчас в теме
30. AndreykO 6 11.03.16 06:48 Сейчас в теме
Спасибо. Очень помогло. Всё работает.
31. starik-2005 3031 12.03.16 11:11 Сейчас в теме
(30) AndreykO, всегда пожалуйста.
32. AlX0id 26.06.16 14:35 Сейчас в теме
чота рано порадовался ) как только решил применить реально, получил:

{Форма.Форма.Форма(102)}: Ошибка при вызове конструктора (ФабрикаXDTO)
МояФабрикаXDTO = Новый ФабрикаXDTO(Модель);
по причине:
Ошибка проверки данных XDTO:
Значение: '\d*\.\d*\.\d*\.\d*\:\d*' не соответствует простому типу: {sample-my-package}testtypes
Несоответствие фасету Pattern = '\d*\.\d*\.\d*\.\d*\:\d*'
по причине:
failed to compile: xmlFAParseRegExp: extra characters


При вот такой проверке:
Сообщить(ПроверитьСтроку("1.233.54.55:80","\d*\.\d*\.\d*\.\d*\:\d*"));
33. starik-2005 3031 26.06.16 15:45 Сейчас в теме
(32) AlX0id, а перед ":" зачем слеш обратный? Уберите его - и все заработает. Обратный слеш только перед спецсимволами можно ставить. В иных случаях регулярное выражение не будет валидным и система будет падать уже на попытке преобразования модели в XDTO-пакет. Можете а этом месте в код добавить проверку на криворуких программистов, чтобы система возвращала им вместо истины или лжи строку "криворукий программер написал неверное регулярное выражение" )))
35. herfis 496 05.08.16 17:02 Сейчас в теме
Прикольно! Жалко, что только проверка...
Для теста регулярок я разное пробовал, но руки зацепились почему-то именно за regexr.com
36. b00t 83 10.09.16 22:47 Сейчас в теме
regex1c (github)

Доработал аналогичную идею, на днях выкачу поиск по шаблону.
Для улучшения производительности сделал предварительную компиляцию выражения (создание XDTO-объекта и сохранение в структуру)
Есть крайне простой тест производительности.
37. binex 277 08.01.17 12:07 Сейчас в теме
\s - пробельный символ - ТАБ, пробел, перенос строки, возврат каретки и т.п.


Это только пробельный символ.

Перевод строки, табуляция - \r и \t, соответственно.
38. starik-2005 3031 09.01.17 09:46 Сейчас в теме
(37)
Это только пробельный символ.

Идем учить мат.часть:
Прикрепленные файлы:
40. alexkon 94 17.01.17 17:08 Сейчас в теме
Коллеги, возник следующий вопрос: пишу в образце простое выражение "тест" и строку поиска "тестовый текст". Совпадений не находит. Если использовать то же самое, но при помощи VBScript.RegExp, то результат положительный. В XDTO какой-то "свой" синтаксис регулярных выражений?
41. starik-2005 3031 17.01.17 18:08 Сейчас в теме
(40) в данном случае отрабатывает именно паттерн, т.е. проверяется соответствие образцу, а не выполняется поиск подстроки в образце. Смысл данного механизма - ограничивать данные в поле. Если Вы в качестве паттерна пишите "тест", то "тестовый текст" у Вас не будет равен "тест", но если задача стоит проверить на наличие во входящем потоке слова "тест", то нужно использовать ".*тест.*" (т.е. указать в шаблоне, что до и после слова "тест" могут следовать (или не следовать) любые символы.
42. alexkon 94 17.01.17 21:46 Сейчас в теме
(41), да я именно так и хотел. Я тоже вписывал в паттерн ".*тест.*" и "тестовый текст" удовлетворял поиску по шаблону. Я думал, что 1С использует в качестве шаблона стандартный синтаксис регулярных выражений, поэтому писал шаблон как и в VBScript.RegExp. Получается, что синтаксис отличается? Если да, то где можно посмотреть синтаксис, который используется при проверке в платформе? К примеру: хочу проверить, что во входящем потоке есть слова, начинающиеся с "test". В VBScript.RegExp написал бы паттерн "\btest". 1С такой паттерн принимать отказывается.
P.S.: кстати, если в VBScript.RegExp попытаться вписать в паттерн "\bтест", то вхождения в потоке "тестовый текст" тоже не найдутся. В инете нашел, что это связано с локализацией. В PHP можно просто указать флаг /u, тогда начинает адекватно работать с кириллицей.
43. starik-2005 3031 18.01.17 11:03 Сейчас в теме
(42) синтаксис не отличается, но нужно иметь ввиду, что в данном случае 1С проверяет соответствие шаблону, а не осуществляет поиск подстроки. Тут необходимо уловить разницу между наличием в строке подстроки, соответствующей шаблону, и когда строка вся целиком соответствует шаблону. Т.е. при таком подходе нельзя делать так, как делали Вы - нужно добавлять ".*" с обоих сторон (как % при ПОДОБНО в запросе).
44. sergzhel 31.05.17 09:51 Сейчас в теме
Доступен ли многострочный режим и получение количество вхождений, игнорирование регистра?
45. starik-2005 3031 31.05.17 11:06 Сейчас в теме
46. clition 15.08.17 13:08 Сейчас в теме
Не помню чьё: "Если у вас есть проблема, и вы собираетесь её решать с помощью регулярных выражений, тогда у вас будет уже две проблемы."
47. starik-2005 3031 15.08.17 13:30 Сейчас в теме
(46)
Не помню чьё
"Ученье - свет, а неученье - чуть свет и на работу..." (с) Народ.
48. frkbvfnjh 785 05.09.17 08:32 Сейчас в теме
Самое нормальное решение данной проблемы встроенными средствами 1С которое я видел ! Вопрос о включении функционала регулярных выражений в язык 1С поднималось на форуме разработчиков не единожды, но разрабы считают, что всегда есть вопросы поважнее и все прекрасно работает без регулярок.
53. frkbvfnjh 785 05.09.17 09:05 Сейчас в теме
Афигеть, спасибо, узнаю сегодня много нового...
56. wbazil 138 20.11.17 18:34 Сейчас в теме
Тестирую, получаю "удивительный" результат, может кто сказать почему?

Сообщить(ПроверитьСтроку("778987", "^\d+$"));     //возвращает Ложь
	
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern =  "^\d+$";
Сообщить(RegExp.Test("778987"));   //возвращает Истину

ПроверитьСтроку функция из (0)
57. starik-2005 3031 21.11.17 13:59 Сейчас в теме
(56) ответил в почте, повторюсь здесь: для 1С в паттерне проверяется шаблон, поэтому нужды в описателях начала и конца строки нет никаких, более того - 1С на них ругается. Поэтому можно смело грохать ^ и $, ибо ^\d+$ в случае XDTO-паттерна будет равнозначна просто \d+.
Vladimir Litvinenko; +1 Ответить
58. Diversus 2306 21.12.17 12:37 Сейчас в теме
Скажите, а предложенный вариант будет работать на серверной 1С, которая установлена на Linux?
59. starik-2005 3031 28.12.17 16:43 Сейчас в теме
60. FilatovRA 168 12.01.18 16:18 Сейчас в теме
ПроверитьСтроку(СокрЛП(НомерГТД), "\d{8}/\d{6}/\d{7}/\d+"); Соответственно для проверки номеров ГТД, наверняка пригодится.
61. starik-2005 3031 29.01.18 11:56 Сейчас в теме
Коллега интереса ради проверил работоспособность механизма проверки регулярок с помощью описанной в статье функции и пришел к следующим выводам:
1. regExp работает в три раза быстрее (COM-объект) при условии, что COM-объект регэкспа кешируется. В принципе я не удивлен - 1С скорее всего для icu сделала нехилый и тромозящий враппер, чтобы все это работало.
2. В XDTO не поддерживаются ссылки (типа \1 \2 ...). Т.е. проверить, что у вас первое слово не повторяется - нереально.

Печалька, конечно, но сам механизм рабочий и позволяет что-то такое провернуть не только под виндой. Думаю, что создам внешнюю нативную компоненту для Linux, чтобы работало не медленнее RegExp'а.
62. It-developer 24 26.02.18 16:28 Сейчас в теме
Блин, фигово, что нет в платформе. Одни велосипеды
66. 7OH 69 02.05.18 09:40 Сейчас в теме
Вопрос по существу.
В оригинале RegExp ещё умеет возвращать массив совпадений.
А тут только на итого проверка - иначе никак ?
67. starik-2005 3031 03.05.18 12:03 Сейчас в теме
(66)
А тут только на итого проверка - иначе никак ?
Смотря чего и где искать. Для "массива совпадений" в небольшом XML может подойти XPath, реализованный в 1С для объекта DOM. Если что-то более серьезное, то иногда проще захардкодить что-то типа "А = СтрРазделить(Строка, "|")". Но если очень охота все отдать на откуп настройщикам универсального механизма, то без RegExp никак (в Linux можно через "sed -e" или "grep" получить все, что душе угодно).
100. KRIHA 111 23.09.20 14:05 Сейчас в теме
(67) доброго дня - можно поподробнее про XPath - реально можно получить массив совпадений?
101. starik-2005 3031 23.09.20 23:46 Сейчас в теме
(100) у меня статья про парсинг сайтов есть - там примерчик.
72. charivnick 45 11.10.18 11:25 Сейчас в теме
Не работают конструкции начало и конца строки: $,^
73. starik-2005 3031 11.10.18 12:36 Сейчас в теме
(72) Да, об этом написано выше.
76. luckily 06.02.19 09:57 Сейчас в теме
(72)
многострочный текст придется по одной строке проверять. как вариант Для Индекс=1 по СтрЧислоСтрок(Текст) Цикл
// СтрПолучитьСтроку(Текст,Индекс) - Получает строку многострочной строки по номеру.
Вставляем Маркер начала строки, например, знак @ и парсим начиная шаблон с него.
СтрТекста="@"+СтрПолучитьСтроку(Текст,Индекс);
И наконец,
Сообщить(ПроверитьСтроку("СтрТекста","@.*"));
77. starik-2005 3031 06.02.19 13:05 Сейчас в теме
(76)
многострочный текст придется по одной строке проверять. как вариант Для Индекс=1 по СтрЧислоСтрок(Текст) Цикл
Да, придется по строке. Но СтрПолучитьСтроку долго работает - лучше так:
  Для Каждого Ст ИЗ СтрРазделить ( Текст, Символы.ВС ) Цикл // разделитель подберите сами
    Сообщить ( ПроверитьСтроку ( Ст, "@.*" ) );
  КонецЦикла; 
74. bad_wag 48 15.01.19 14:52 Сейчас в теме
А можно ли сделать, чтобы передаешь функции строку, а она возвращает вырезанный кусок по паттерну?
75. starik-2005 3031 15.01.19 15:05 Сейчас в теме
(74)
А можно ли сделать
Через XDTO нельзя. А вот через сом-объект RegExp можно (см. (66))
78. TuneSoft 246 06.05.19 06:52 Сейчас в теме
Заголовок статьи не соответствует содержанию. Никак не описано получение значений по паттерну. Зря потраченное время на прочтение статьи.
79. starik-2005 3031 06.05.19 10:50 Сейчас в теме
(78) предложите заголовок, который будет более информативным))
80. Diversus 2306 21.06.19 11:55 Сейчас в теме
(0) А подскажите, как проверить с учетом кирилицы?

Например есть строка: Купить мороженное завтра в 15:00
Регулярное выражение: (завтра в )\d{2}:\d{2}

По идее все правильно (обычно все тестирую https://regex101.com/), но вот из 1С вашим способом не работает. Как воспользоваться?
Спасибо! Классная идея.

PS: Вообще не совсем понятно, почему до сих пор в платформе нет нормальных регулярных выражений встроенных в платформу.
81. Diversus 2306 21.06.19 11:59 Сейчас в теме
(80)
(завтра в )\d{2}:\d{2}

Пробовал и вот так: завтра в \d{2}:\d{2}
82. Diversus 2306 21.06.19 12:10 Сейчас в теме
(80) Разобрался.
ПроверитьСтроку("Купить мороженное завтра в 15:00", ".*завтра в \d{2}:\d{2}")
starik-2005; +1 Ответить
83. AlexeyPapanov 456 03.08.19 20:03 Сейчас в теме
Автор, ты крут!
Очень пригодилось.
Подскажите, а если разные строки в цикле проверять на разные фасеты, то можно ли как-то закешировать фабрикуXDTO?

Я было хотел так сделать
Функция ПроверитьСтрокуПоФасету(ОбъектФабрикаXDTO, Строка, Фасет)
    
    Пакет = ОбъектФабрикаXDTO.Пакеты.Получить("sample-my-package");
    Тест = ОбъектФабрикаXDTO.Создать(Пакет.Получить("TestObj"));

    Попытка
        Тест.TestItem = Строка;
        Возврат Истина
    Исключение
        Возврат Ложь
    КонецПопытки;
    
КонецФункции
Показать


Но у фабрики же в тексте модели XML подсовывается фасет:
"            |<pattern>" + Фасет + "</pattern>"

Т.е. перед циклом я не соображу как создать один раз ФабрикуXDTO, чтобы потом этот объект передавать в функцию
ПроверитьСтрокуПоФасету(ОбъектФабрикаXDTO, Строка, Фасет)
84. AlexeyPapanov 456 03.08.19 22:02 Сейчас в теме
(83) в сообщении (70) есть ответ, только я все равно не понимаю.
Функция ПроверитьСтроку(Строка, Фасет, ПервыйВызов=Истина)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(
                "<Model xmlns=""http://v8.1c.ru/8.1/xdto"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""Model"">
                |<package targetNamespace=""sample-my-package"">
                |<valueType name=""testtypes"" base=""xs:string"">
                |<pattern>" + Фасет + "</pattern>
                |</valueType>
                |<ob jectType name=""TestObj"">
                |<property xmlns:d4p1=""sample-my-package"" name=""TestItem"" type=""d4p1:testtypes""/>
                |</objectType>
                |</package>
                |</Model>");

    Модель = ФабрикаXDTO.ПрочитатьXML(Чтение);
	
    // Для "кеширования" - ускоряет вызов в цикле
	Если ПервыйВызов=Истина Тогда
		МояФабрикаXDTO = Новый ФабрикаXDTO(Модель);
	КонецЕсли; 
	
	Пакет = МояФабрикаXDTO.Пакеты.Получить("sample-my-package");
    Тест = МояФабрикаXDTO.Создать(Пакет.Получить("TestObj"));

    Попытка
        Тест.TestItem = Строка;
        Возврат Истина
    Исключение
        Возврат Ложь
    КонецПопытки;
    
КонецФункции
Показать

допустим, первый раз вызвали в цикле, фабрика создалась.
потом вне функции перед вторым ее вызовом мы меняем переменную на Ложь, чтобы объект не создавался.
но не пойму где его хранить с первого вызова?
извиняюсь за тупость
85. starik-2005 3031 04.08.19 11:10 Сейчас в теме
(84) Если разные строки на РАЗНЫЕ фасеты, то придется создать фабрику каждый раз, т.к. я, лично, не знаю способа переопределения типа в уже созданной фабрике.

А если фасет одинаковый, то его можно и закешировать. Хранить кеш нужно в вызывающей функции.
86. AlexeyPapanov 456 04.08.19 14:27 Сейчас в теме
(85) Спасибо! а то я вчера поздно сидел - смотрю, один пишет - получилось. Я думаю - как?...
87. maxster545 02.09.19 12:18 Сейчас в теме
Выдаёт такую ошибку:

Модель = ФабрикаXDTO.ПрочитатьXML(Чтение);
по причине:
Ошибка разбора XML: - [6,14]
Фатальная ошибка:
Specification mandate value for attribute jectType

Что делаю не так?
88. starik-2005 3031 02.09.19 18:50 Сейчас в теме
(87) Вы как пользователь - полностью игнорируете детали.
Оставьте свое сообщение