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

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

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

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

Регулярные выражения или 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор: ChatApp1

Источник

Оставить комментарий