Регулярные выражения, RegEx или RegExp.



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



Интересно, что у аналитиков регулярно встречается запрос на SQL (и на собеседованиях дают задачки на него), а вот про регулярные выражения почему-то не вспоминают. То ли они аналитикам не нужны, то ли считается, что это знание "по умолчанию", ну что про них говорить :) Между тем, я вижу на курсах, что многие аналитики вообще про них не знают, а они начинают всплывать при интеграциях: при валидации параметров входящих сообщений (pattern в схеме данных в OpenAPI), при мэппинге данных, при указании имен файлов в файловом обмене.



Это специальный язык, через который можно задать условия для текста. То есть, найти в тексте такую подстроку, которая удовлетворяет этим условиям.



Для чего может использоваться:

🔹 проверка формата текстового значения (валидация — например, в json schema или xsd, причём валидировать можно как значения, так и названия полей);

🔹 поиск (например, в текстовом файле, CSV, таблице Excel или в БД);

🔹 извлечение подстроки из текста;

🔹 подсчет числа вхождений, соответствующих маске;

🔹 замена подстроки, подходящей под маску;

🔹 очистка данных (удаление кавычек, двойных пробелов, скобок и т.п., извлечение значений: ФИО, дат, телефонов, URL, email)



Регэкспы распространены повсеместно: от утилиты командной строки grep, выполняющей поиск в файлах и постоянно использующейся программистами и админами (отсюда глагол "грепать", "грепнуть" — получить подмножество соответствующих строк из исходного файла), до библиотек во всех языках программирования, функций в SQL, инструментов поиска в текстовых редакторах и интернет-поисковиках.



Синтаксис регулярных выражений стандартизован как часть стандарта POSIX. На практике чаще применяется более мощный PCRE, родом из языка Perl, так что в каждой конкретной системе синтаксис выражений может немного отличаться.



Движки выполнения хорошо оптимизированы и работают быстро; под регулярными выражениями лежит хорошая математика, и в среднем их вычислительная сложность линейна — O(n) — но можно написать такое выражение, которое надолго завесит ваш поиск :)



Язык задания паттернов в своей основе прост:



— просто набор символов -> полное совпадение с учетом регистра (по умолчанию. можно отключить учёт регистра)

— . -> любой символ

— вертикальная палка | -> одно или другое: елка|ёлка

— скобки -> область действия и последовательность операторов, как в математике: (е|ё)лка, Ната(л(ь|и)я|ша)

— квадратные скобки -> любой из указанных символов: [её]лка, Натал[ьи]я, [0-9] - цифры, [A-Z] - буквы латиницы в верхнем регистре

- [^] -> отрицание, символ, не входящий в набор: [^аеёиоуэюя] означает "любой символ, кроме гласных букв".



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

? -> ноль или один предыдущий символ: RegExp? найдет и RegEx, и RegExp

* -> ноль или несколько предыдущих символов

+ -> один или несколько предыдущих символов

{n} -> повтор предыдущего символа n раз. {n,m} - повтор от n до m раз



^ и $ -> начало и конец строки. \w — слово, \b — граница слова (но только для английского языка!).



Пример: ^(?:\d{3}-){2}\d{4}$ - строка, содержащая телефонный номер. Или так: ^[0-9]{3}-[0-9]{3}-[0-9]{4}$.



Дальше начинается сплошной драконий покер: можно искать слово X, за которым не следует слово Y; строки, в которых упоминается Z, но не упоминается W, и так далее. Инструмент невероятно мощный, можно с ним удивительные вещи делать. Правда, разобраться в уже готовых регэкспах бывает сложно, их обзывают write only, а выглядят они, как шифр на клингонском.



Почитать вводную статью на русском: https://techrocks.ru/2022/05/31/regex-complete-guide/

Пройти подробнейший tutorial на английском: https://www.regular-expressions.info/tutorial.html

Попробовать составить и поотлаживать регулярные выражения: https://regex101.com/



Вот тут примеры пожестче: https://habr.com/ru/articles/349860/



Кстати, ChatGPT умеет по текстовому описанию умеет строить регулярные выражения (но рекомендую проверять, как обычно — он может и ошибок насажать).