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