Top.Mail.Ru
Заказать консультацию
специалиста 1С
Отправить заявку

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

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

Драчев Сергей Посмотреть все статьи >> Специалист по внедрению 1С партнерской сети "ИнфоСофт"
02.12.2021
11566
Время прочтения - 6 мин.
Заказать консультацию

Регулярные выражения (их еще называют regexp, или regex) — это механизм для поиска и замены какого-либо текста. К сожалению, встроенный язык 1С не предоставляет «родных» инструментов для работы с регулярными выражениями.

Но не все так плохо — никто не мешает использовать встроенный в Windows (в Windows 98 и выше) объект — VBScript.RegExp.

Чем это лучше простого поиска? Тем, что позволяет задать шаблон.

Например, вам дают задание найти в 200 страницах информации все даты рождения в формате ДД.ММ.ГГГГГ. Вам надо обработать её и передать дальше. Как это сделать с помощью простого поиска? Вы же не знаете заранее, какая именно дата будет.

А регулярное выражение позволяет задать шаблон «найди мне цифры в таком-то формате».

С этим разобрались. Так как же работать с регулярными выражениями в 1С?

Для начала необходимо создать объект VBScript.RegExp.

1.jpg

Окей, с этим разобрались, но что дальше? Дальше нам необходимо познакомиться со свойствами и методами нашего объекта. У объекта VBScript.RegExp есть 4 свойства:

Global – свойство типа булево, которое позволяет нам проверять строку до первого соответствия шаблону (Ложь) или по всему тексту (Истина);

IgnorCase – свойство типа булево, которое позволяет нам учитывать (Ложь) или не учитывать (Истина) регистр символов;

Multiline – свойство типа булево, которое позволяет нам работать в многострочный (Истина) или однострочный (Ложь) режим;

Patternстрока используемая как шаблон регулярного выражения. Чаще всего, говоря о регулярном выражении, люди имеют ввиду именно шаблон.

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

2.jpg

Хочется отметить, что сразу при создании объекта VBScript.RegExp, его свойства типа булева хранят значение «Ложь», следовательно, в нашем случае правильнее будет написать

3.jpg

Со свойствами разобрались, теперь перейдем к методам. У объекта VBScript.RegExp есть три метода:

Test(СтрокаТекста). Метод проверяет переданную в параметре строку на соответствие шаблону (например, проверка корректности адреса эл. почты). Возвращаемые значение: Ложь — строка соответствует шаблону, Истина — строка не соответствует шаблону;

Execute(СтрокаТекста). Ищет соответствующие шаблону вхождения в параметре СтрокаТекста. Возвращаемые значения: коллекция найденных подстрок;

Replace(СтрокаТекста, СтрокаЗамены). Ищет соответствующие шаблону вхождения в первом параметре (СтрокаТекста) и заменяет их на значение второго параметра (СтрокаЗамены). Возвращаемые значения: измененный (возможно) параметр СтрокаТекста.

Разберем каждый метод по отдельности, начнем с метода Test.

Пожалуй, самый простой метод объекта VBScript.RegExp. Работает как простой поиск — ищет в строке поиска, совпадения со строкой свойства Pattern, и если находит возвращает значение «Истина», иначе «Ложь».

Предлагаю вам решить задачу, в каком варианте строки поиска процедура выведет нам сообщение на экран?

4.jpg

Правильный ответ: Вариант 1.

Вариант 1 хоть и содержит точно такое же слово, как и в шаблоне, но первая буква слова заглавная, и так как у объекта VBScript.RegExp свойство IgnorCase не объявлено, а значит равно «Ложь», регистр важен и учитывается.

Вариант 2 полностью совпадает с нашим шаблоном, поэтому сообщение выведено не будет.

Вариант 3 хоть и содержит несколько слов, но в нем есть слово, которое полностью соответствует нашему шаблону, поэтому сообщение выведено не будет.

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

Для начала нужно внимательно изучить данные, которые мы хотим получить на выходе, и составить по ним шаблон. В email два разделителя — собачка «@» и точка «.».

Наш email должен содержать набор символов, затем собачку «@», затем снова набор символов, затем точка «.» и наконец набор символов. В результате у нас должно получится что-то вроде:

Символы@символы.символы

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


Таблица спецсимволов

\

Экранизация

.

То же что и \w

\w \W

\w - любой символ слова. Эквивалентно [A-Za-z0-9_].

\W - обратно "\w". Эквивалентно [^A-Za-z0-9_].

\d \D

\d - цифра. Эквивалентно [0-9].

\D - НЕ цифра. Эквивалентно [^0-9].

Подпишитесь на дайджест!
Подпишитесь на дайджест, и получайте ежемесячно подборку полезных статей.

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


Таблица квантификаторов

?

Ноль или одно

*

Ноль или более

+

Один или более

 В рамках этой задачи нам необходимо проверить является ли введенный email адрес корректным, но как же нам это сделать? Ведь мы не можем указать бесконечное множество вариантов email адресов в свойство Pattern, а затем сравнивать их с введенной строкой.

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

Используем нашу маску Символы@символы.символы, и попробуем составить шаблон для поиска используя спецсимволы и квантификаторы. Стоит заметить, что если мы попробуем использовать шаблон «.+@.+..+» то нужного результата мы не достигнем, дело в том что при такой записи, программа не сможет отделить спецсимвол «.», и просто символ точка «.», чтобы достичь желаемого результата нам необходимо воспользоваться экранизацией, спецсимвол «\», таким образом мы выделяем для программы символ точка «.», и он будет восприниматься не как спецсимвол, а как просто символ точка «.». У нас должно получиться «.+@.+\..+», таким образом программа отработает правильно. Так же возможно написание шаблона с помощью спецсимвола «\w». Используя спецсимвол «\w», у нас должно получиться шаблон «\w+@\w+\.\w+»

5.jpg

Перейдем к следующему методу объекта VBScript.RegExp это метод Execute.

В отличии от метода Test, метод Execute, ведет поиск соответствующих шаблону вхождений в строке-оригинале, и возвращает их в виде коллекции найденных подстрок, что даёт нам возможность работать с ними.

У метода Execute есть два свойства:

Count – содержит число найденных вхождений в строке-оригинале

Item – содержит коллекцию найденных подстрок

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

6.jpg

Для решения этой задачи в шаблоне для поиска мы указали спецсимвол «\d» с квантификатором «+», что означает что нас интересует числа длинною от 1, и взяли спецсимвол и квантификатор в круглые скобки «()», круглые скобки захватывают значение, которое находится в них в отдельную группу свойства Item Метода Execute что позволяет нам записать значение в переменную «productId» и вывести его на экран. В результате на экран вывелось три сообщения с идентификаторами продукта «1234», «4321» и «1111».

Перейдем к последнему методу объекта VBScript.RegExp, это метод Replace.

Он ищет соответствующие шаблону вхождения в первом параметре (СтрокаТекста) и заменяет их на значение второго параметра (СтрокаЗамены).

Перейдем к практике

Представьте, что у вас есть XML файл правил обмена данными между двумя базами 1С, фирма 1С выпустила обновление, и теперь наименование реквизита «СтавкиНДС» заменено на «СтавкаНДС», вам нужно используя регулярные выражения изменить XML файл чтобы обмен между информационными базами снова начал работать. Приступим.

7.jpg

В результате выполнения этой процедуры в переменную «Результат» будет записана исходная строка текста, но наименование реквизита «СтавкиНДС» переименуется в «СтавкаНДС» и правила обмена в формате XML будут работать.

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



Заказать консультацию специалиста 1С
Оставьте заявку и наши эксперты проконсультируют вас по данной статье.
Отправить заявку

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

Рассказать друзьям
Для разработчиков 1С
Вам может быть интересно: