Регулярные выражения: как научиться читать между строк

Представьте: нужно проверить документ или веб-страницу и найти повторяющиеся слова, чтобы, скажем, заменить их. А если найти нужно не просто слова, а электронные адреса, которые бывают разными.
Решение этой задачи существенно упростит использование регулярных выражений.
Регулярные выражения или regex (от англ. regular expression) — это особый синтаксис для описания шаблонов поиска информации. С их помощью можно искать, заменять или извлекать данные из текста с высокой точностью. В основе регулярных выражений лежат символы, которые задают правила для поиска, например, всех цифр или слов, начинающихся на определенную букву. Регулярные выражения позволяют описать сложные условия поиска в простой и читаемой форме, что делает их незаменимыми для различных задач.
Регулярные выражения помогут в разных случаях — от валидации данных, например, при проверке форматов номера телефона до анализа текстов: получения ссылок или другой информации.
Посмотрим на синтаксис регулярных выражений. Дальше на примерах станет понятнее.
Синтаксис регулярных выражений
Основные элементы синтаксиса регулярных выражений:
Символы и классы символов:
. — любой символ, кроме новой строки
\d — любая цифра (эквивалент [0–9])
\w — любой буквенно-цифровой символ (эквивалент [a-zA-Z0–9_])
\s — любой пробельный символ (включая пробел, табуляцию, новую строку)
Квантификаторы:
* — 0 или более повторений
+ — 1 или более повторений
? — делает символ необязательным, означает 0 или 1 повторение
{n} — ровно n повторений
{n,} — n или более повторений
{n, m} — от n до m повторений
Группировка и альтернативы:
(abc) — группа символов
a|b — либо a, либо b (альтернатива)
Начало и конец строки:
^ — начало строки
$ — конец строки
Экранирование:
\ — экранирует специальные символы, чтобы использовать их в буквальном смысле (например, \. для поиска точки)
Давайте разберемся, как использовать синтаксис регулярных выражений на простом примере. Будем использовать регулярные выражения для поиска определенных шаблонов в строках текста. Для примера возьмем задачу нахождения всех email-адресов в тексте.
Задача: Найти email-адрес в тексте
Допустим, есть текст, и нужно найти все email-адреса в нем.
Пример текста:
Email-адреса: example@mail.com, test123@domain.org, и invalid-email@domain.com.
Напишем регулярное выражение для поиска email-адресов
Email-адрес состоит из двух частей:
Логин (например, example в example@mail.com);
Домен (например, mail.com в example@mail.com).
Мы можем использовать регулярное выражение:
[A-Za-z0–9._%±]+@[A-Za-z0–9.-]+\.[A-Za-z]{2,}
Разбор регулярного выражения:
[A-Za-z0–9._%±] — соответствует любому символу в логине email (буквы, цифры, точки, подчеркивания, проценты, плюсы и минусы);
+ — означает «один или более символов», то есть логин может быть длинным, но не пустым;
@ — соответствует символу @ в email;
[A-Za-z0–9.-] — соответствует символам домена (буквы, цифры, точки и дефисы);
\. — экранированная точка, чтобы она символизировала именно точку, а не «любой символ»;
[A-Za-z]{2,} — соответствует доменному расширению (например, .com или .org), состоящему как минимум из двух букв.
Или другой пример. Понадобилось найти все номера телефонов в тексте. Они могут быть записаны в разных форматах: с разделителями или без них.
Задача: Найти все номера телефонов в тексте
Предположим, у нас есть текст, и мы хотим найти все номера телефонов, которые могут быть в таких форматах:
+7 (123) 456–78–90
8–123–456–78–90
+7 123 456 78 90
Напишем регулярное выражение для поиска номера телефона
Чтобы найти такие номера, нам нужно учесть несколько возможных вариантов записи:
Начало с +7 или 8;
Возможные разделители, такие как пробелы, дефисы и скобки;
Строка состоит из цифр.
Регулярное выражение для поиска номера телефона может выглядеть так:
(\+7×8)[\s\-]?\(?\d{3}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}
Разбор регулярного выражения:
(\+7×8) — ищем либо +7, либо 8 в начале номера.
[\s\-]? — необязательный символ пробела или дефиса между частями номера (может быть один или отсутствовать).
\(?\d{3}\)? — три цифры, которые могут быть окружены скобками (например, (123) или 123).
[\s\-]? — снова необязательный пробел или дефис.
\d{3} — три цифры (например, для кода города).
[\s\-]? — снова необязательный пробел или дефис.
\d{2} — две цифры (например, для последней части номера).
[\s\-]? — снова необязательный пробел или дефис.
\d{2} — последние две цифры.
Регулярные выражения могут быть «жадными» или «ленивыми». Жадные стараются захватить больше символов, а ленивые — как можно меньше. Например, выражение .* захватит все символы, начиная с текущей позиции, и до последнего возможного совпадения, стараясь захватить весь текст, даже если есть более короткие варианты. В то время как .*? — только до первого совпадения, то количество символов, которое нужно для первого успешного совпадения.
Регулярные выражения зависят от регистра. Например, если в регулярном выражении указано слово «яблоко», то оно будет находить только «яблоко» с маленькой буквы. Если же в тексте будет написано «Яблоко» с большой буквы, то оно уже не будет найдено этим выражением.
Если нужно, чтобы регулярное выражение не зависело от регистра (то есть находило и «яблоко», и «Яблоко»), нужно указать, что регистр не важен, например, добавив дополнительный флажок i.
Многие языки программирования поддерживают регулярные выражения для работы, например, Java, Perl, PHP, JavaScript, Python и другие.
Как использовать регулярные выражения с ChatApp?
Кейс: Магазин ювелирных украшений хочет поздравлять своих клиентов с днем рождения и отправлять им скидку на покупку. Для этого нужно точно определить дату рождения каждого клиента, которую они указывают при регистрации.
Регулярные выражения в этом случае могут помочь в валидации даты рождения, чтобы убедиться, что информация введена правильно.
Как настроить сбор данных через конструктор ботов ChatApp?
Менеджер запрашивает дату рождения в формате «DD.MM.YYYY», клиент вводит свою дату рождения.

2. Происходит валидация через регулярные выражения.
В блоке «Условие» в Конструкторе ботов выберите «RegEx» и добавьте регулярное выражение из выпадающего списка или укажите свое.

Регулярное выражение проверяет, что введенная дата соответствует правильному формату и гарантирует, что данные введены корректно, без ошибок (например, чтобы не было букв).
Пример регулярного выражения для валидации даты рождения: ^\d{2}\.\d{2}\.\d{4}$
3. Получив дату рождения клиента, можно автоматизировать рассылку подарков и скидок за несколько дней до дня рождения.

Лайфхаки по использованию
Регулярные выражения довольно полезны, но их использование может быть не таким очевидным, как это может показаться на первый взгляд.
Читаемость: Регулярные выражения могут быстро стать сложными и трудными для понимания. Добавляйте комментарии к регулярным выражениям, особенно если они используются в больших проектах.
Производительность: Сложные регулярные выражения могут значительно замедлить выполнение программы, особенно если они используются на больших объемах данных. В таких случаях стоит оптимизировать выражения и избегать использования сложных паттернов.
Тестирование: Прежде чем внедрять регулярные выражения в проект, всегда проверяйте их на различных тестовых данных. Для этого можно использовать онлайн-инструменты, такие как regex101, которые помогут вам проверить ваше регулярное выражение на практике.
Регулярные выражения — это мощный инструмент. Они позволяют эффективно решать задачи поиска, замены и валидации данных. Однако, несмотря на свою гибкость, регулярные выражения требуют аккуратности в написании и тестировании. Правильное использование regex может значительно упростить жизнь, а неправильное — создать путаницу и замедлить работу.
Habrahabr.ru прочитано 6086 раз