Если обычный человек посмотрит на исходный код программы, написанный на популярных языках вроде JavaScript или Python, то по контексту и знакомым словам он сможет понять, что происходит. Но регулярные выражения со стороны похожи на случайный набор символов – будто кошка прошла по клавиатуре. В этом случае даже код на Ассемблере выглядит более читаемым.

Мы в «ЛАНИТ-Интеграции» не понаслышке знаем, как бывает сложно собрать воедино данные из нескольких источников, привести их к общему виду и создать на их основе единую таблицу с полным отчетом. Для решения этой задачи был создан плагин «Аналитика» для Р7 офис как инструмент автоматизации для выгрузки и обработки данных. В этой статье в блоге ЛАНИТ хочу рассказать вам о новых возможностях поиска данных в плагине в сочетании с функционалом RegExp (они же регулярные выражения или просто регулярки).

А что вообще такое регулярные выражения?

Если вкратце, RegExp – мощный инструмент для поиска данных по шаблонам, состоящим из паттернов (признаков данных). При составлении шаблонов используется специальный синтаксис, обозначающий наборы символов – их называют паттернами или, более правильно, «символьными классами».

Специальные обозначения

\d

Определяет, что в значении присутствуют цифры

\D

Определяет, что значение не является числовым

\w

Латинский алфавит, цифры и символ нижнего подчеркивания

\W

Определяет все, что не является латинскими буквами, цифрами и нижнем подчеркиванием

\s

Значения, содержащие пробелы, табуляции и символы новой строки

\S

Значения, не содержащие пробелы, табуляции или символы новой строки

\n

Только новая строка

\t

Только табуляция

.

Определяет любой одиночный символ, кроме новой строки

|

Альтернация – логическое "ИЛИ"

\

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

!

Негативный поиск, проверяет, что текущее значение не соответствует шаблону

Якоря

^

Искать совпадение в начале значения

$

Искать совпадение с конца значения

Наборы и диапазоны

[...]

Только указанные в скобках символы

[0-9] или [4-8]

Только цифры в определенном диапазоне

[a-zA-Z] или [а-яА-Я]

Только буквы в определенном диапазоне, регистре или алфавите

[^.]

Исключает из поиска указанные после ^ символы

Квантификаторы

*

Найти ноль или более повторений элемента перед символом звездочки

+

Найти одно или более повторений элемента перед символом плюс

?

Не обязательно - не учитывать шаблон перед знаком вопроса, если ничего нет

{5}

В фигурных скобках указано точное количество повторений значения перед фигурными скобками

{2,5}

В фигурных скобках указан диапазон от и до для поиска количества повторений значения перед фигурными скобками.

{2,}

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

Скобочные группы

( )

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

\1

Обратная ссылка - это доступ к полученным данным по шаблону из скобочных групп в RegExp. Вывод можно получить, используя \1, где 1 - это порядковой номер группы

Вставки фрагментов совпадения в строке замены

$1

Вставляет содержимое из скобочной группы регулярного выражения, где 1 - это порядковой номер группы

$&

Вставляет всё найденное совпадение

$`

Вставляет часть строки до совпадения

$'

Вставляет часть строки после совпадения

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

Зачем нужны RegExp на простом примере

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

Рассмотрим RegExp на простом примере. Допустим, вам звонил клиент, и вы хорошо помните первые три цифры (123) и две последние (67) его номера телефона. Историю звонков просмотреть нельзя, есть только список контактов. Получается нам нужно найти в базе номера, соответствующие шаблону: +7(???)123-??-67.

Регулярное выражение для этой задачи будет вот таким: \+7\(\d*\)123-\d{2}-67$

Давайте разберем его детально.

Нам известна структура номера телефона:

  • он начинается c +7,

  • в скобках код региона,

  • затем цифры 123 и в конце 67.

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

В регулярных выражениях скобки – это группы шаблонов, а плюс означает неограниченное количество.

В неизвестных нам местах укажем абстрактные признаки того, что там может находиться. Для кода региона укажем, что там должны быть цифры - это обозначается как \d и звездочкой *. Укажем, что этих цифр несколько. В части номера, где нам неизвестны конкретные цифры, зададим \d{2} – фигурные скобки указывают, что там могут находиться ровно две произвольные цифры.

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

Регулярные выражения в плагине «Аналитика» для Р7 офис

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

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

Скрин 1. Плагин с действием “Модификатор RegExp”
Скрин 1. Плагин с действием “Модификатор RegExp”

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

От слов к действиям

Разберём самый популярный пример использования RegExp — проверку электронной почты. Предположим, у нас есть список контактов, где в столбце Email могут содержаться некорректные данные. Ручная проверка заняла бы много времени, но её можно автоматизировать, применив регулярное выражение. Оно будет проверять значения на соответствие типичным признакам Email-адреса: наличие символа @ (собаки) и точки в доменной части.

Скрин 2. Плагин действия “Найти и заменить”
Скрин 2. Плагин действия “Найти и заменить”

Перед вами — пошаговая инструкция по очистке списка контактов от некорректных Email-адресов с помощью RegExp-шаблонов и инструмента «Найти и заменить».

  • После создания источника данных со списком контактов добавим к нему действие «Найти и заменить».

  • В поле «Найти значение» зададим негативный RegExp-шаблон ^(?!.+@.+\..+) для выявления ячеек с некорректными Email-адресами.

  • Активируем опцию «Использовать RegExp» (устанавливаем соответствующую галочку).

  • В поле «Заменить на» укажем значение «Email не указан» для замены неподходящих записей.

  • В разделе «В диапазоне» выберем столбец таблицы, содержащий адреса электронной почты.

  • Нажимаем кнопку «Добавить» для применения изменений.

  • После выполнения обработки все некорректные Email-адреса будут автоматически заменены на стандартную фразу «Email не указан».

Затем можно применить действие «Фильтр», чтобы отобрать контакты со значением «Email не указан» – это позволит получить список записей, в которых электронная почта была указана некорректно.

Скрин 3. Плагин действия “Фильтрация файлов”
Скрин 3. Плагин действия “Фильтрация файлов”

Аналогичный подход можно применить для фильтрации файлов в источнике «Из папки». Например, если у вас есть набор файлов, где одни названия содержат латинские символы, а другие – кириллицу, можно использовать RegExp для сохранения обоих вариантов. В параметре «Найти» укажите несколько шаблонов поиска, разделенных вертикальной чертой (|) в RegExp это означает логическое «или». Например для поиска синонимов в названии может примениться такое регулярное выражение «филиал.|affiliate.». В итоге мы получим список файлов, имеющих как в название «филиал», так и affiliate.

Итог

Регулярные выражения — это мощный и гибкий инструмент для поиска данных, который при этом достаточно прост в освоении. В сети доступно множество обучающих материалов и готовых примеров использования RegExp. Теперь все эти возможности доступны и в плагине «Аналитика» — вы можете сразу применять полученные знания на практике.

Комментарии (0)