Регулярные выражения в 1С

Aug 17, 2022 16:22

1. Значение Регулярных выражений

Регулярных выражения - это один из инструментов, который предназначен для анализа текстов и имеет довольно широкий функционал. В самой системе 1С не предусмотрен инструментарий для работы с выражениями RegExp. Но, при этом, даже на платформе 1С, можно пользоваться объектом из Windows, который осуществляет работу с регулярными выражениями - VBScript.RegExp.

Более подробно о регулярных выражениях можно прочитать здесь.

Все программные коды, которые будут описаны ниже, действительны для всех конфигураций и версий системы 1С 8.х.

2. Функционал и примеры регулярных выражений

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



Рис. 1 Пример использования регулярных выражения для создания объекта

Также стоит отметить, что за глобальные переменные представляются переменные вида:



Рис. 2 Глобальные переменные в примере с регулярными выражениями

Разберём перечень свойств, которые присущи объекту VBScript.RegExp:

1. Global. Значение «Ложь» по умолчанию и поиск значения «Истина» Истина по всему объёму текста;

2. IgnorCase. По умолчанию ему присваивается значение «Ложь», и оно учитывается для всего символьного регистра, а в значении «Истина» символьный регистр не будет учтён;

3. Multiline. Также по умолчанию присваивается значение «Ложь» - является объектом на одну строку; в значении «Истина» обозначает объект на большее количество строк.

4. Pattern. Это свойство, которое представляет собой некоторую шаблонную строку при использовании регулярных выражений.

Далее представим перечень методов, которые могут быть использованы в примере с регулярными выражениями:

1. Test(СтрокаТекста) - данный метод осуществляет сверку строки, которую в него подставили, на то, насколько она соответствует шаблонной строке. Это может быть, к примеру, поверка на корректность адреса. Возвращается «Ложь», если строка имеет полное соответствие с шаблоном, а значение «Истина» - в случае, если не подтверждено соответствие шаблону;

2. Replace(СтрокаТекста, СтрокаЗамены) - в данном методе для первого параметра происходит поиск строки, которая соответствует шаблону, а при помощи второго параметра происходит замена первого значения;

3. Execute(СтрокаТекста) - этот метод производит поиск строки, которая соответствует указанному шаблону, и возвращает значения в виде коллекции подстрок, которые были найдены.

Также у данного объекта есть софт, при помощи которого происходит отладка шаблонов для регулярных выражений - это RegexBuddy.

Далее представлен пример того, как при помощи данного объекта программно описать поиск HTML тегов внутри строки:

Следующий пример с регулярными выражениями ищет HTML теги в строке:



Рис. 3 Регулярные выражения в 1С для поиска тегов в строке

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



Рис. 4 Применение шаблона регулярных выражений в коде

После этого будет осуществлён поиск самого тега, а также текстовой информации, которая идёт после данного тега. Чтобы сделать обработку подобного шаблона регулярных выражений, необходимо написать код следующего вида:



Рис. 5 Обработка шаблона регулярных выражений

Стоит рассмотреть также и пример того, как можно использовать регулярные выражения для проверки email, то есть проверки корректности введения электронного адреса:



Рис. 6 Регулярные выражения для проверки email

Если внутри текста регулярные выражения встречаются часто, то лучшим вариантом решения данной проблемы будет написание специальной оболочки. Главными позициями в таком случае будут:
  • Глобальная переменная, которая будет вложенным объектом внутри объекта VBScript.RegExp;
  • Проведение инициализации вышеуказанной глобальной переменной, которая будет производится при каждом запуске данной конфигурации или в конкретных случаях, если прописана специальная функция;
  • Инкапсуляция по методам внутри объекта VBScript.RegExp.
Регулярные выражения без внешних компонент

&НаКлиенте
Функция ПроверитьСтроку(Строка, Фасет)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(
"
|

|
|
" + Фасет + "
|
|
|
|");

Модель = Фабрика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}" - от двух до четырех цифр. Можно указать одну и всего цифру для строгого соответвия.

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

Поддержка регулярных выражений во встроенном языке

Планируется в версии 8.3.23

По многочисленным просьбам разработчиков, использующих технологии 1С, в версии 8.3.23 будет реализовано поддержка регулярных выражений во встроенном языке.

Будут добавлены новые методы глобального контекста (все функции регистрозависимые):
  • СтрНайтиПоРегулярномуВыражению(<Строка>, <РегулярноеВыражение>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>). Находит в указанной строке вхождения подстрок, соответствующих заданному регулярному выражению.
  • СтрЗаменитьПоРегулярномуВыражению(<Строка>, <РегулярноеВыражение>, <ПодстрокаЗамены>). Находит в указанной строке все вхождения подстрок, соответствующих заданному регулярному выражению, и заменяет их на подстроку замены.
  • СтрПодобнаПоРегулярномуВыражению(<Строка>, <РегулярноеВыражение>). Проверяет указанную строку на соответствие заданному регулярному выражению.
Также будет добавлен новый объект РезультатПоискаПоРегулярномуВыражению, содержащий в себе информацию о результатах поиска регулярного выражения в строке. Метод СтрНайтиПоРегулярномуВыражению возвращает такой объект.

Свойства объекта РезультатПоискаПоРегулярномуВыражению:
  • НачальнаяПозиция - позиция первого знака найденной подстроки.
  • Длина - длина найденной подстроки.
Рассмотрим несколько примеров кода.

Вот такой код:

Строка = "Красный это #ff0000";

РегулярноеВыражение = "#([a-f0-9]{6})";

РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Строка, РегулярноеВыражение);

Если РезультатПоиска.НачальнаяПозиция <> 0 Тогда

СтрокаРезультат = СРед(Строка,

РезультатПоиска.НачальнаяПозиция, РезультатПоиска.Длина);

КонецЕсли;

вернет СтрокаРезультат равную «#ff0000».

Этот код:

Строка = " Красный это #ff0000";

РегулярноеВыражение = "#([a-f0-9]{6})";

ПодстрокаЗамены = "";

СтрокаРезультат = СтрЗаменитьПоРегулярномуВыражению(Строка,

РегулярноеВыражение, ПодстрокаЗамены);

вернет СтрокаРезультат равную «Красный это ».

А этот код (проверка строки на соответствие шаблону телефонного номера)

Строка = "+9(999)999 99-99";
   РегулярноеВыражение = "(\+)?([- ()]?\d[- _():=+]?){10,14}";

Результат = СтрПодобнаПоРегулярномуВыражению(Строка, РегулярноеВыражение);

вернет Результат равный Истина.

Невозможно перечислить все задачи, где пригодятся регулярные выражения.

Это и проверка строк на соответствие шаблонам (телефонные номера, электронная почта, номера договоров и т.п.), сложный поиск в тексте документов, парсинг документов XML в ЭДО на соответствие требуемым шаблонам (иногда в счёт-фактуре нужно проверять номер ГТД на соответствие 5-6 шаблонам), парсинг исходных файлов приложения (или массовая замена строк кода по шаблону), парсинг логов (например, технологического журнала), и многое другое.

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

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля - краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

#ff0000, программирование

Previous post Next post
Up