Заметки из Зазеркалья

01.08.2022

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

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

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

По многочисленным просьбам разработчиков, использующих наши технологии, в версии 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 шаблонам), парсинг исходных файлов приложения (или массовая замена строк кода по шаблону), парсинг логов (например, технологического журнала), и многое другое.

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

Рассказать друзьям: