Регулярные выражения: как находить и проверять текст по шаблонам
Регулярные выражения (или regex) — это способ описать структуру текста, чтобы искать или проверять его по заданным правилам. Они нужны, когда важна не конкретная строка, а её форма: например, три цифры подряд, адрес электронной почты или слово с заглавной буквы.
Такие шаблоны находят применение в программировании, обработке данных, валидации форм и текстовых редакторах, позволяя извлекать даты, номера телефонов или ссылки из больших объёмов информации.
Канал об информационной безопасности: новости, туториалы, кейсы для ИТ-специалистов, бизнеса и новичков. [Security Controls]
Простейшие шаблоны "Regex" и их возможности
Самый простой шаблон — это точное совпадение с текстом. Если задать `кот`, поиск выделит это слово в строке «Это кот на ковре», но пропустит «котёнок». Чтобы шаблон стал универсальным, используются специальные символы, которые задают гибкие правила.
Точка заменяет любой одиночный символ, кроме перевода строки, если не указаны особые настройки. Шаблон `к.т` означает, что первая буква — `к`, последняя — `т`, а между ними — любой символ, но только один. Это соответствует `кот`, `кит`, `к9т`, даже `к#т`, но не `крот`, где между `к` и `т` два символа. Такой подход удобен, когда часть структуры неизвестна, но её длина строго ограничена.
Квадратные скобки задают набор допустимых символов для одной позиции. Запись `[аеи]` требует, чтобы на этом месте стояла одна из гласных — `а`, `е` или `и`. Шаблон `к[аеи]т` найдёт `кат`, `кет`, `кит`, но не `кот`, так как `о` нет в списке. Диапазоны упрощают задачу: `[а-я]` охватывает все строчные буквы русского алфавита, `[0-9]` — любую цифру. Например, `д[0-9]м` подойдёт для `д5м`, `д9м`, но не для `дам`.
Иногда нужно исключить определённые символы. Для этого внутри скобок в начале ставится знак `^`. Шаблон `[^0-9]` соответствует любому символу, кроме цифры, — например, `а`, `#` или пробелу, но не `5`. Здесь `^` работает только внутри скобок и только в начале. Если написать `[0^9]`, это означает выбор одного из символов: `0`, `^` или `9`. Например, `к[0^9]т` найдёт `к0т`, `к^т`, `к9т`, но не `кат`.
Управление повторениями
Часто требуется указать, сколько раз должен встречаться символ или группа. Символ `*` означает, что предшествующий элемент может появляться ноль или более раз. Шаблон `ка*т` найдёт `кт` (где `а` отсутствует), `кат`, `каат` и так далее. Похожий символ `+` требует как минимум одного появления: `ка+т` соответствует `кат`, `каат`, но не `кт`. Знак `?` делает элемент необязательным — он либо есть, либо нет. Так, `ка?т` подойдёт для `кт` и `кат`, но не для `каат`.
Для точного контроля используются фигурные скобки. Запись `\d{4}` требует ровно четыре цифры подряд, например `1234`. Если указать диапазон, как в `а{2,4}`, шаблон найдёт `аа`, `ааа` или `аааа`, но не одиночное `а` или `ааааа`. Эти конструкции позволяют задавать строгие границы для повторяющихся элементов.
Группы и позиционный контекст
Круглые скобки объединяют символы в группы, чтобы работать с ними как с единым целым. Шаблон `(аб)+` требует, чтобы пара символов `аб` повторялась один или несколько раз. Он найдёт `аб`, `абаб`, `абабаб`, но не `а` или `абб`. Это отличается от `аб+`, где `+` относится только к `б`, находя `аб`, `абб`, `аббб`. Группы особенно полезны для сложных структур, таких как повторяющиеся слова или фразы.
Контекст в строке задаётся позиционными метками. Символ `^` вне скобок указывает на начало строки, а `$` — на её конец. Шаблон `^кот` найдёт `кот` только в начале текста, например в «кот на ковре», но не в «Это кот». Шаблон `кот$` сработает для «Это кот», но не для «котёнок». Если объединить их в `^кот$`, шаблон будет соответствовать только строке, состоящей ровно из слова `кот`, без лишних символов.
Сокращения и экранирование символов
Для упрощения работы в регулярных выражениях используются сокращения. Запись `\d` обозначает любую цифру, эквивалентную `[0-9]`. Символ `\w` соответствует букве, цифре или подчёркиванию, а `\s` — пробелу, табуляции или переводу строки. Их противоположности — заглавные версии: `\D` для любого символа, кроме цифры, `\W` для символов, не являющихся буквой, цифрой или подчёркиванием, и `\S` для непробельных символов. Например, `\D` найдёт `а` или `#`, но не `5`.
Символы вроде `.`, `*`, `+` имеют специальное значение. Чтобы использовать их буквально, перед ними ставится обратный слэш — это называется экранированием. Например, `\.` обозначает обычную точку, а шаблон `3\.14` найдёт `3.14`, но не `3a14`. Экранирование позволяет включать в шаблон любые символы, даже те, что обычно интерпретируются как команды.
Практические примеры для реальных задач
Регулярные выражения оживают, когда их применяют к конкретным задачам. Рассмотрим номер телефона в формате `+7-XXX-XXX-XX-XX`. Шаблон `^\+7-\d{3}-\d{3}-\d{2}-\d{2}$` требует строгого соответствия: экранированный плюс, цифра `7`, дефис, три цифры, ещё три цифры и две группы по две цифры. Он найдёт `+7-925-123-45-67`, но не `+79251234567` (без дефисов) или `+7-925-123-456-78` (лишняя цифра в конце).
Для проверки адреса электронной почты подойдёт шаблон `[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}`. Первая часть `[a-z0-9._%+-]+` описывает имя пользователя из букв, цифр и разрешённых символов, повторяющихся один или более раз. После `@` следует домен `[a-z0-9.-]+`, затем точка и доменная зона `[a-z]{2,}` из двух или более букв. Этот шаблон соответствует `ivan@example.com` или `test.mail@domain.ru`, но отклонит `ivan@ru`, где зона слишком короткая.
Для поиска дат в формате `ДД.ММ.ГГГГ` можно использовать шаблон `\d{2}\.\d{2}\.\d{4}`. Он найдёт `01.12.2023`, но не `1.12.2023`, так как требует ровно две цифры для дня и месяца. Чтобы сделать шаблон гибким и учесть разные форматы, можно доработать его, например, добавить поддержку разделителей вроде точки или слэша, но это требует более сложных конструкций.
Конструирование шаблонов для текста
Регулярные выражения позволяют выстраивать точные правила для обработки текста, будь то проверка форм, поиск номеров телефонов или выделение дат. Разобравшись с базовыми элементами — точкой, скобками, повторениями, — вы сможете решать самые разные задачи.
Проверяйте шаблоны на платформах вроде regex101.com, начинайте с простых конструкций и постепенно усложняйте их. Анализируйте ошибки, подстраивайте решения под свои цели, и работа с текстом станет проще и эффективнее.
#регулярныевыражения #regex #поискпотексту #разбортекста #валидацияданных #patternmatching #обучениепрограммированию #textprocessing #dataextraction #cybersecurity