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

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

См. также

Сервисы интеграции без Шины и интеграции

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    2515    dsdred    16    

57

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

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

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

11.03.2024    5761    dsdred    53    

81

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

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

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

24.01.2024    5757    YA_418728146    25    

67

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

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

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

11.12.2023    6897    dsdred    36    

113

1С-ная магия

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

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

06.10.2023    18971    SeiOkami    46    

118

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

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

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

14.09.2023    12633    human_new    27    

76

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

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

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

28.08.2023    9309    YA_418728146    6    

143

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

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

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

20.08.2023    6494    sebekerga    54    

95
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
89. luckily 02.11.19 14:01 Сейчас в теме
Не указали что есть вариант использования условий:
Вертикальная черта разделяет допустимые варианты. Например, gray|grey соответствует gray или grey
т.е. для проверки дат "01.01.20" и 01.01.2019 может выполняться одним фасетом = "\d{2}\.\d{2}\.(\d{4}|\d{2})"
90. starik-2005 3036 03.11.19 15:49 Сейчас в теме
(89) книжкой, описывающей почти все нюансы работы с регулярными выражениями, можно убить. Что Вы хотите от статьи? Почему не жалуетесь, что про группы не написано?
megodeath; fvadim; +2 Ответить
91. Зеленоград 11.02.20 18:33 Сейчас в теме
Искал ссылки на регулярки в 20 году, думал что платформа уже содержит это. Но нет, вернулся к COMОбъект("VBScript.RegExp")
92. starik-2005 3036 11.02.20 21:34 Сейчас в теме
(91)
вернулся к COMОбъект
Не работает на кошерных осях (
110. peper- 16.08.22 19:51 Сейчас в теме
(91) вам надо было еще два года подождать. В платформе 8.3.23 появилась "Поддержка регулярных выражений во встроенном языке". :)
93. acanta 11.02.20 22:37 Сейчас в теме
https://youtu.be/5UAVMSiMnnk
Т.е. вопрос примерно такой - могут ли вообще к 1с каким то образом прикручиваться чудесные линуксовые файловые утилиты (любые)?
94. starik-2005 3036 11.02.20 23:12 Сейчас в теме
(93)
могут ли вообще к 1с каким то образом прикручиваться чудесные линуксовые файловые утилиты (любые)?
А в чем проблема? Любая файловая утилита может взять данные из файла и положить результат в файл. Для того, чтобы использовать это в 1С, можно просто писать в файл что-то, что нужно обработать, вызвать чудесную команду системы (тот же grep -e, например) и попросить записывать результат в файл. Потом файл читаем и данные в нем рассовываем по массивам/соответствиям/структурам - что нам больше нравится. И тут можно и подстроки искать, и вхождения, и просто проверять по регулярке - любой каприз. Но, опять же, в винде это работать не будет, ибо нет в ней "искаропки" grep'а, sed'а и прочих "чудесных утилит".

С точки зрения ОСи, то что либу подключить как СОМ-объет, что команду системы выполнить - все-равно файл прочитать и выполнить. Другое дело, что СОМ можно создать однажды и вызвать много раз, а команда системы будет каждый раз вызываться "заново". С другой стороны, ОСь все-равно закеширует исполняемый файл и читать его каждый раз с диска не будет, а вот пачку системных вызовов все-равно исполнит.
95. acanta 11.02.20 23:20 Сейчас в теме
(94) а чем отличается подключение grep e с точки зрения 1с от любимого всеми апача ? Или это тоже 1с- файл -утилита-файл-1с?
Или у 1с есть метод для подключения апача, но нет метода для grep?
96. starik-2005 3036 11.02.20 23:25 Сейчас в теме
(95) grep - это программа для "поиска подстрок", "-е" - ключ программы, говорящий о том, что подстрока - это регулярное выражение.
Прикрепленные файлы:
97. shmalevoz 304 17.02.20 19:19 Сейчас в теме
Может кому пригодится, да и чтобы не потерялось - шаблоны проверки для даты. Проверяет макс. год 3999, количество дней в месяце (в феврале допускает 29), в квадратных скобках необязательное, разделитель любой символ не число
формат ГГГГММдд[ЧЧммсс]
([0-3]\d{3}(0[1-9]|1[012])(0[1-9]|[12][0-9])|[0-3]\d{3}(0[13-9]|1[012])30|[0-3]\d{3}(0[13578]|1[02])31)(([0-1]\d|2[0-3])[0-5]\d[0-5]\d){0,1}

формат ГГГГ-ММ-дд[ ЧЧ:мм:сс]
([0-3]\d{3}\D(0[1-9]|1[012])\D(0[1-9]|[12][0-9])|[0-3]\d{3}\D(0[13-9]|1[012])\D30|[0-3]\d{3}\D(0[13578]|1[02])\D31)(\D([0-1]\d|2[0-3])\D[0-5]\d\D[0-5]\d){0,1}

формат дд-ММ-ГГГГ[ ЧЧ:мм:сс]
((0[1-9]|[12][0-9])\D(0[1-9]|1[012])\D[0-3]\d{3}|30\D(0[13-9]|1[012])\D[0-3]\d{3}|31\D(0[13578]|1[02])\D[0-3]\d{3})(\D([0-1]\d|2[0-3])\D[0-5]\d\D[0-5]\d){0,1}

формат ЧЧ:мм:сс ГГГГ-ММ-дд
([0-1]\d|2[0-3])\D[0-5]\d\D[0-5]\d\D([0-3]\d{3}\D(0[1-9]|1[012])\D(0[1-9]|[12][0-9])|[0-3]\d{3}\D(0[13-9]|1[012])\D30|[0-3]\d{3}\D(0[13578]|1[02])\D31)

формат ЧЧ:мм:сс дд-ММ-ГГГГ
([0-1]\d|2[0-3])\D[0-5]\d\D[0-5]\d\D((0[1-9]|[12][0-9])\D(0[1-9]|1[012])\D[0-3]\d{3}|30\D(0[13-9]|1[012])\D[0-3]\d{3}|31\D(0[13578]|1[02])\D[0-3]\d{3})
98. twilight_dream 12.05.20 13:26 Сейчас в теме
Тоесть вычленить из даты год, месяц, день, я так понимаю, не выйдет? А тестировалось ли на содержание даты внутри текста?
Мне к примеру что то вот такое надо
	мас = регВыр (строка,"(\d{4})-(\d{2})-(\d{2}).(\d{2}):(\d{2}):(\d{2})");
	Если  ТипЗнч(мас) = тип("Массив") тогда
		текГод     = Число(мас [0][0]);
		текМесяц   = Число(мас [0][1]);
		текДень    = Число(мас [0][2]);
		текЧас     = Число(мас [0][3]);
		текМинута  = Число(мас [0][4]);
		текСекунда = Число(мас [0][5]);
		Возврат дата(текГод,текМесяц,текДень,текЧас,текМинута,текСекунда);
Показать



Линуксоиды как правило любят использовать shell, там очень мощный язык рег. выражений. как получить результат такого использования тема отдельная.
99. shmalevoz 304 04.06.20 00:54 Сейчас в теме
(98) Вычленить не выйдет, а проверить на вхождение можно
.*

это любое количество любых символов, обрамить шаблон с начала и конца
twilight_dream; +1 Ответить
102. sacred 173 16.10.20 03:35 Сейчас в теме
А вот так:
Сообщить(ПроверитьСтроку("<p><strong>Обязанности:</strong></p>", "Обязанности"));

Не работает. Говорит, мол - нет.
Как бы исправить?
103. starik-2005 3036 16.10.20 09:34 Сейчас в теме
(102) так выше в комментах уже упоминалось, что проверка не ищет подстроку, а сравнивает с паттерном. Правильный фильтр ".*Слово.*"
twilight_dream; +1 Ответить
109. timurhv 01.02.22 22:34 Сейчас в теме
В пятницу напьюсь:
План задач на версию 8.3.23 платформы
Поддержка регулярных выражений в платформе
peper-; PlatonStepan; fvadim; +3 Ответить
111. peper- 16.08.22 19:55 Сейчас в теме
(109) И в августе она уже там (в 8.3.23) появилась, только пока не выложена для открытого тестирования - только для участников бета-тестирование. Но к концу года уже можно ожидать...
116. i_dubrivin 21.12.23 14:24 Сейчас в теме
Кто-нибудь понимает, как в регулярное выражение поместить символ "/"?
В выражении "Возврат средств по ПП от (\d{2})\/(\d{2})\/(\d{4}) No (\d+)\. Запрещено зачисление на карточный счет ИП\/ЮЛ" экранировал, получаю ошибку как на скриншоте
Прикрепленные файлы:
117. starik-2005 3036 21.12.23 14:32 Сейчас в теме
118. i_dubrivin 21.12.23 15:24 Сейчас в теме
Да просто без экранирования. Он не считается спецсимволом
119. starik-2005 3036 21.12.23 16:48 Сейчас в теме
(118)
Да просто без экранирования.
Ну так убери экранирование.
Оставьте свое сообщение