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

30 августа 2023
0 комментариев

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

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

Например, база данных содержит коды товаров «А101» и «А102», которые должны быть заменены на единый код — «В100». Один из вариантов решения — применение регулярного выражения, при помощи которого данное действие можно выполнить за один шаг.

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

Синтаксис регулярных выражений

Регулярное выражение — это последовательность символов, написанных по определенным правилам. Чаще всего их используют для поиска и замены с учетом сложных условий. Фактически регулярное выражение — это однострочная программа.

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

Применение символов

Квадратные скобки представляют собой элементарное регулярное выражение, которое образует подмножество символов.

  • [абм] — буква «а» или «б» или «м».
  • [m,k t] — «m», «k», «t», запятая или пробел.
  • [19] — цифра 1 или 9.

Диапазон задается, когда между символами появляется «-».

  • [0-4] — соответствует диапазону от 0 до 4.
  • [а-яА-ЯёЁ] — соответствует всем буквам кириллицы.
  • [A-Za-z] — соответствует всем буквам латинского алфавита.

Исключение символов — если внутри квадратных скобок записать циркумфлекс (каретка) «^». Так, выражению [^reg] соответствует любой символ, кроме «r», «e» и «g».

Начало и конец строки задаются символами каретки ^ и доллара $. Они называются «якоря». Каретка означает совпадение с началом текста, а доллар — с концом. Например, выбор первой буквы (^mmmmm) и последней (m$ — mmmm). Выражение ^..$ используется для проверки того, что строка полностью соответствует заданному шаблону.

Метасимволы и квантификаторы

Метасимволы — это специальные символы, которые имеют особое значение и функцию при работе с регулярными выражениями:. ^ $ * + ? { } [ ] \ | ( ).

Чтобы использовать метасимволы как обычные символы, их необходимо экранировать, добавляя «\» перед ними.

Количество вхождений символов в строку задается с помощью квантификаторов. Это специальный ограничитель, который указывает количество возможных повторений символа, группы или класса символов, находящихся в регулярном выражении перед ним: {n} — n вхождений символов в строку. {n,} — n или более вхождений, а {n,m} — не менее n и не более m.

Например, ^[0-9]{2}$ соответствует двум вхождениям любой цифры.

Некоторые часто используемые конструкции получили в языке регулярных выражений специальные обозначения:

  • * — ноль или большее число вхождений символов в строку. Эквивалентно комбинации {0,};
  • + — одно или большее число вхождений символов в строку. Эквивалентно комбинации {1,};
  • ? — ни одного или одно вхождение символов в строку. Эквивалентно комбинации {0,1}.

Например, выражение Петровa? будет соответствовать строкам, которые начинаются с «Петров» и могут далее иметь символ «a».

Все квантификаторы являются «жадными», т.е. при поиске соответствия ищется самая длинная подстрока, соответствующая шаблону, и не учитываются более короткие.

Некоторые квантификаторы имеют две версии:

  • Жадная версия. Данный квантификатор пытается найти максимально возможное число соответствий элемента.
  • Нежадная (ленивая) версия. При использовании нежадных идентификаторов предпринимается попытка найти минимально возможное число соответствий элемента.

Можно превратить жадный квантификатор в отложенный квантификатор, добавив ?. Например, <.+?> — соответствует любому символу, один или несколько раз найденному между < и >.

Стоит отметить, что использованный шаблон можно размещать внутри круглых скобок, когда необходима группировка фрагментов. Часть шаблона можно заключить в скобки (...). Это называется «скобочная группа».

Без скобок шаблон ma+ означает символ m и идущий после него символ a, который повторяется один или более раз. Например, maaa или maaaaaaa. Скобки группируют символы вместе. Так что (ma)+ означает ma, mama и так далее.

Круглые скобки группируют вместе часть регулярного выражения, так что квантификатор применяется к ним в целом. Скобочные группы нумеруются слева направо.

Можно исключить скобочную группу из запоминания, добавив в ее начало (?:...). То есть, она позволяет применять квантификаторы и другие операторы к части шаблона, но не создает отдельную группу для сохранения найденного текста.

Например, регулярное выражение: "(?:[0-9]{3}-)[0-9]{3}-[0-9]{5}" соответствует шаблону СНИЛСа («723-086-67890»), но не сохраняет первую группу (три цифры и дефис) в отдельную захватывающую группу.

Поиск слова с различным окончанием может быть описан так: (?:бел(?:ая|ый)). Результат: белая, белый, но не белОЕ.

Также в регулярных выражениях существуют специальные классы символов. Они упрощают поиск определенных типов символов в тексте. Специальные классы символов позволяют сократить запись в регулярных выражениях и делают их более читаемыми. Например, \d{3} соответствует любой последовательности из трех цифр, а \w+ соответствует любому слову (последовательности букв, цифр или символов подчеркивания).

Владение регулярными выражениями — это ценный навык. Они позволяют реализовать сложную и тонкую обработку текста буквально в одну строку, не прибегая к написанию кода на языке программирования. В данном разделе приведен всего лишь краткий обзор синтаксиса. Более подробно с ним можно познакомиться здесь.

Далее рассмотрим применение регулярных выражений в компоненте Калькулятор платформы Loginom.

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

В платформе Loginom используется библиотека PCRE2 (Perl Compatible Regular Expressions 2). Она позволяет использовать регулярные выражения в стиле Perl с некоторыми отличиями. Синтаксис PCRE2 мощнее и гибче, чем стандартные регулярные выражения POSIX.

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

С помощью регулярных выражений на платформе Loginom можно решить следующие задачи:

  • поиск и гибкая замена;
  • подготовка и обработка данных;
  • минимизация написания кода и другие.

Для их решения можно воспользоваться встроенными функциями Калькулятора:

  • RegExEmail. Извлекает Email-адрес из строки.
  • RegExDomain. Извлекает адрес веб-сайта из строки.
  • RegExMatch. Осуществляет проверку строки на соответствие регулярному выражению.
  • RegExMatchedExp. Возвращает часть строки, соответствующую регулярному выражению.
  • RegExMatchCount. Возвращает число фрагментов строки, соответствующих заданному регулярному выражению.
  • RegExMatchedNamedSubExp. Возвращает группу части строки, соответствующую регулярному выражению.
  • RegExMatchedSubExp. Извлекает группу фрагмента строки, соответствующую заданному регулярному выражению.
  • RegExReplace. Заменяет определенную часть вхождений подстроки или символа в строке на другую подстроку или символ.
  • RegExReplaceAll. Возвращает строку, в которой все вхождения регулярного выражения будут заменены на строку замены.

Также регулярные выражения применяются в компоненте Замена. Компонент заменяет данные исходного набора, используя таблицы замен.

Поиск и замена осуществляются по:

  • точному совпадению;
  • регулярному выражению.

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

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

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

Когда стоит избегать написания регулярных выражений

Регулярные выражения — мощный инструмент для обработки текстовых данных, но они не всегда являются оптимальным выбором. Когда речь идет о простых операциях, таких как поиск конкретных слов или фраз, замена текста, извлечение подстрок, регулярные выражения будут избыточными. Вместо того, чтобы создавать сложные шаблоны, иногда более понятным и эффективным решением будет использование строковых функций, встроенных в Loginom.

Замена целиком строки или слова

Для замены строки нет необходимости в регулярных выражениях. В Loginom есть компонент Замена. Замену можно произвести по точному значению. Например, номеру телефона или паспортным данным.

Если в строке есть слово, которое необходимо заменить, в частности, код товара, можно применить функцию Replace в Калькуляторе. Передаем следующие параметры: Replace(Name,"А101","В101", true, true).

Замена слова

Проверка даты

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

([0-2][0-9]|[3][01]).([0][1-9]|[1][0-2]).[12][09][0-9][0-9]

Синтаксис непростой и при написании легко допустить ошибку. В Калькуляторе представлена функция StrToDate, которая справится с этой задачей без самостоятельного написания регулярного выражения. Функция конвертирует строку, содержащую дату, в формат типа «Дата и Время». Вид можно задать по своему усмотрению.

Проверка даты с помощью функции StrToDate

Выделение подстроки

Для извлечения символов из строки без учета того, будут это буквы или цифры, можно воспользоваться функциями Калькулятора Right или Left. Необходимо передать нужное количество символов.

Возвращение символов справа с помощью функции Right

В компоненте Калькулятор есть возможность извлечь подстроку из строки с определенной позиции и нужной длины. Для этого стоит воспользоваться функцией SubStr.

Готовые регулярные выражения

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

Проверка почты

Кроме того в Калькулятор встроена функция для проверки домена RegExDomain. Шаблон регулярного выражения доменного имени самостоятельно писать не требуется.

Однако не все задачи по обработке строк можно решить при помощи простых функций. При решении нетривиальных задач регулярные выражения являются оптимальным выбором. Рассмотрим некоторые кейсы, в которых можно применять регулярные выражения на платформе Loginom, используя компонент Калькулятор.

Регулярные выражения для нетривиальных задач

Кейс 1 — удаление лишних символов

Используем функцию: RegExReplaceAll.

Передаем:

  • символы . и ;, которые необходимо удалить;
  • поле «Name»;
  • строка, которая будет вставлена вместо части входной строки, в данном случае это пустота.

Получаем: RegExReplaceAll("[.;]",Name,"").

Удаление лишних символов

В результате появляется новый столбец с обновленными значениями, из которых исключены лишние символы.

Можно использовать другое регулярное выражение: [^(а-я)|^(А-Я)|(\s)]. Останутся только строчные буквы, заглавные буквы и пробелы, а все остальные символы будут удалены.

Кейс 2 — поиск заданных строк

В базе следующие данные.

Исходные данные

Необходимо узнать, какие препараты представлены в упаковках по 10 или 30 грамм. Воспользуемся функцией RegExMath. Передаем следующие аргументы: RegExMatch("((10)|(30)) г", Name).

Поиск заданных строк

Кейс 3 — валидация номеров телефонов

Одним из решений, является применение функции с аргументами. RegExMatchedExp("^((\+?7|8)[\-]?)?((\([0-9]{3}\))|([0-9]{3}))?([\-])?([0-9]{3}[\-]?[0-9]{2}[\-]?[0-9]{2})$", Phone).

Она возвращает только те номера, которые прошли верификацию.

Проверка номера телефона

Кейс 4 — выделение фамилии

Фамилия и паспортные данные находятся в одном столбце. Необходимо их разделить.

Для получения фамилии, воспользуемся функцией RegExMatchedExp. Она возвращает часть строки, соответствующую регулярному выражению.

Выделение строки разной длины

В нашем примере: RegExMatchedExp("[А-Я]{1}[а-яё]{1,50}", Name).

Это регулярное выражение означает, что фамилия начинается с заглавной буквы, остальные символы строчные. Наибольшая длина — 50 символов. Обратите внимание: «ё» не входит в интервал «а-я», поэтому ее необходимо указывать отдельно.

Кейс 5 — выделение номера договора

Номер договора содержит лишние символы и дату. Разделим строку на номер договора и дату подписания.

Выделение номера разной длины

Номер договора получаем через функцию RegExMatchedExp и регулярного выражения [0-9]+. Дату с помощью двух функций: Right и StrToDate.

Кейс 6 — поиск вхождения строк

В наших данных есть информация о вспомогательных веществах препарата. Необходимо узнать, где присутствует «желатин» или «сахароза». Воспользуемся функцией RegExMatch, она проверяет соответствие строки регулярному выражению. Зададим поля: RegExMatch("(желатин)|(сахароза)", substance). Получаем результат.

Поиск вхождений строк

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

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

Когда применять регулярные выражения

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

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

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

Работа с регулярными выражениями на платформе Loginom имеет свои плюсы и минусы.

Плюсы:

  • решение нетривиальных задач обработки текстов;
  • относительно быстрая скорость выполнения;
  • сложная обработка текстов без написания кода на языках программирования;
  • наличие готовых регулярных выражения для проверки e-mail-адресов и доменов.

Минусы:

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

Регулярные выражения — мощный инструмент для работы с текстом, при условии грамотного применения. Использование дополнительных инструментов и сервисов для их создания облегчает работу. Для решения нетривиальных задач обработки строк он может быть предпочтительней написания кода, т.к. синтаксис регулярных выражений проще языков программирования. Но несмотря на это, данный инструмент все равно требует осторожного применения.

Дополнительные материалы:

Курс Loginom Skills «Стандартизация и очистка НСИ»

Критерии качества данных 

#loginom

Смотрите также