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

от автора

Представьте: нужно проверить документ или веб-страницу и найти повторяющиеся слова, чтобы, скажем, заменить их. А если найти нужно не просто слова, а электронные адреса, которые бывают разными.

Решение этой задачи существенно упростит использование регулярных выражений.

Регулярные выражения или regex (от англ. regular expression) – это особый синтаксис для описания шаблонов поиска информации. С их помощью можно искать, заменять или извлекать данные из текста с высокой точностью. В основе регулярных выражений лежат символы, которые задают правила для поиска, например, всех цифр или слов, начинающихся на определенную букву. Регулярные выражения позволяют описать сложные условия поиска в простой и читаемой форме, что делает их незаменимыми для различных задач.

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

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

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

Основные элементы синтаксиса регулярных выражений:

  1. Символы и классы символов:

    • . – любой символ, кроме новой строки

    • \d – любая цифра (эквивалент [0-9])

    • \w – любой буквенно-цифровой символ (эквивалент [a-zA-Z0-9_])

    • \s – любой пробельный символ (включая пробел, табуляцию, новую строку)

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

    • * – 0 или более повторений

    • + – 1 или более повторений

    • ? – делает символ необязательным, означает 0 или 1 повторение

    • {n} – ровно n повторений

    • {n,} – n или более повторений

    • {n,m} – от n до m повторений

  3. Группировка и альтернативы:

    • (abc) – группа символов

    • a|b – либо a, либо b (альтернатива)

  4. Начало и конец строки:

    • ^ – начало строки

    • $ – конец строки

  5. Экранирование:

    • \ – экранирует специальные символы, чтобы использовать их в буквальном смысле (например, \. для поиска точки)

Давайте разберемся, как использовать синтаксис регулярных выражений на простом примере. Будем использовать регулярные выражения для поиска определенных шаблонов в строках текста. Для примера возьмем задачу нахождения всех email-адресов в тексте. 

Задача: Найти email-адрес в тексте

Допустим, есть текст, и нужно найти все email-адреса в нем.

Пример текста:

Email-адреса: example@mail.comtest123@domain.org, и invalid-email@domain.com.

Напишем регулярное выражение для поиска email-адресов

Email-адрес состоит из двух частей:

  1. Логин (например, example в example@mail.com);

  2. Домен (например, 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

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

Чтобы найти такие номера, нам нужно учесть несколько возможных вариантов записи:

  1. Начало с +7 или 8;

  2. Возможные разделители, такие как пробелы, дефисы и скобки;

  3. Строка состоит из цифр.

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

(\+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?

1. Менеджер запрашивает дату рождения в формате «DD.MM.YYYY», клиент вводит свою дату рождения.

2. Происходит валидация через регулярные выражения

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

Пример сценария в Конструкторе ботов ChatApp

Пример сценария в Конструкторе ботов ChatApp

Регулярное выражение проверяет, что введенная дата соответствует правильному формату и гарантирует, что данные введены корректно, без ошибок (например, чтобы не было букв).

Пример регулярного выражения для валидации даты рождения: ^\d{2}\.\d{2}\.\d{4}$

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

Лайфхаки по использованию

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

  1. Читаемость: Регулярные выражения могут быстро стать сложными и трудными для понимания. Добавляйте комментарии к регулярным выражениям, особенно если они используются в больших проектах.

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

  3. Тестирование: Прежде чем внедрять регулярные выражения в проект, всегда проверяйте их на различных тестовых данных. Для этого можно использовать онлайн-инструменты, такие как regex101, которые помогут проверить ваше регулярное выражение на практике.

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


ссылка на оригинал статьи https://habr.com/ru/articles/897206/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *