Регулярные выражения для людей: практическое руководство
У регулярных выражений (regex) проблема с репутацией. Они выглядят так, будто кто-то уснул на клавиатуре: ^[\w.-]+@[\w-]+\.[\w.]+$. Они встречаются в ревью кода, текстовых редакторах, поисковых инструментах и валидации форм. Разработчики либо любят их, либо всячески избегают.
Истина где-то посередине. Regex действительно мощный инструмент. И действительно сбивает с толку поначалу. Но вам не нужно осваивать каждую малоизвестную возможность, чтобы получить практическую пользу. Горстка шаблонов покрывает подавляющее большинство реальных задач.
Что на самом деле делает regex
Регулярное выражение — это шаблон, описывающий набор строк. Вы передаёте его поисковому инструменту, и он находит каждую строку, соответствующую шаблону. Думайте об этом как об очень точном поисковом запросе.
Обычный поиск: найти именно «hello». Поиск по regex: найти всё, что выглядит как адрес электронной почты, номер телефона, дата, URL или любой другой шаблон, который вы можете описать.
Знаете ли вы? Регулярные выражения были изобретены математиком Стивеном Клини в 1956 году как нотация для описания «регулярных языков» в теории формальных языков. Они проникли в вычислительную технику через ранние текстовые редакторы Unix в 1960-х и 1970-х годах.
Строительные блоки
Литеральные символы
Простейшее регулярное выражение — это просто буквальный текст. Шаблон hello соответствует строке «hello». Ничего сложного.
Точка (.) — любой одиночный символ
Точка соответствует любому одиночному символу (кроме перевода строки).
h.tсоответствует «hat», «hit», «hot», «hut» и даже «h3t»
Классы символов ([]) — определённые символы
Квадратные скобки определяют набор допустимых символов в данной позиции.
[aeiou]— любая гласная[0-9]— любая цифра[A-Za-z]— любая буква (верхний или нижний регистр)[^0-9]— любой символ, НЕ являющийся цифрой (^внутри скобок означает «не»)
Квантификаторы — сколько
Эти символы управляют повторениями:
| Символ | Значение | Пример | Соответствует |
|---|---|---|---|
* |
Ноль или более | ab*c |
«ac», «abc», «abbc», «abbbc» |
+ |
Один или более | ab+c |
«abc», «abbc», «abbbc» (но не «ac») |
? |
Ноль или один | colou?r |
«color» и «colour» |
{3} |
Ровно 3 | a{3} |
«aaa» |
{2,4} |
От 2 до 4 | a{2,4} |
«aa», «aaa», «aaaa» |
Якоря — позиция
^в начале означает «начало строки»$в конце означает «конец строки»^hello$соответствует только точной строке «hello», но не «say hello» или «hello world»
Сокращённые классы
Часто используемые классы символов имеют сокращения:
| Сокращение | Эквивалент | Значение |
|---|---|---|
\d |
[0-9] |
Любая цифра |
\w |
[A-Za-z0-9_] |
Любой «словесный» символ |
\s |
[ \t\n\r] |
Любой пробельный символ |
\D |
[^0-9] |
Любой нецифровой символ |
\W |
[^A-Za-z0-9_] |
Любой несловесный символ |
\S |
[^ \t\n\r] |
Любой непробельный символ |
Группы (()) — группировка и захват
Круглые скобки группируют части шаблона. Это полезно для применения квантификаторов к группе или для извлечения определённых частей совпадения.
(ab)+соответствует «ab», «abab», «ababab»(\d{3})-(\d{4})соответствует «555-1234» и захватывает «555» и «1234» отдельно
Вертикальная черта (|) — или
Вертикальная черта означает «или».
cat|dogсоответствует «cat» или «dog»(jpg|png|gif)соответствует любому из этих трёх расширений изображений
Практические шаблоны, которые можно использовать уже сегодня
Поиск адреса электронной почты (упрощённый)
[\w.-]+@[\w-]+\.[\w.]+
Разбор:
[\w.-]+— один или более словесных символов, точек или дефисов (локальная часть)@— буквальный символ @[\w-]+— один или более словесных символов или дефисов (домен)\.— буквальная точка (экранирована, потому что.— специальный символ)[\w.]+— один или более словесных символов или точек (TLD)
Предупреждение Валидация электронной почты с помощью regex печально известна своей сложностью. Простой шаблон выше покрывает 99% реальных адресов, но не обрабатывает все граничные случаи, определённые в спецификации RFC. Для валидации в продуктивной среде используйте библиотеку валидации электронной почты вашего языка программирования.
Поиск номера телефона (формат США)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Соответствует:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
Поиск URL
https?://[\w.-]+(/[\w./-]*)?
Соответствует:
Поиск даты (ГГГГ-ММ-ДД)
\d{4}-\d{2}-\d{2}
Соответствует: 2026-03-23, 1999-12-31 и т.д.
Поиск повторяющихся слов
\b(\w+)\s+\1\b
Находит повторяющиеся слова вроде «the the» или «is is». \1 ссылается на то, что было захвачено первой группой.
Поиск IPv4-адреса
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Соответствует шаблонам вроде 192.168.1.1 или 10.0.0.255.
Советы по написанию regex
1. Начинайте просто, потом уточняйте
Не пытайтесь написать идеальный regex с первой попытки. Начните с широкого шаблона, протестируйте его на ваших данных и постепенно сужайте.
2. Всегда тестируйте
В regex легко допустить ошибку. Пропущенный квантификатор или неэкранированная точка могут полностью изменить результат поиска. Всегда проверяйте шаблон на реальных данных перед использованием в продуктивной среде.
3. Экранируйте специальные символы
Если нужно найти буквальную точку, скобку, квадратную скобку или другой специальный символ, экранируйте его обратной косой чертой: \., \(, \[.
4. Используйте комментарии и именованные группы
В сложных шаблонах используйте именованные группы и комментарии (где поддерживается), чтобы сделать regex читаемым. Ваше будущее «я» скажет вам спасибо.
5. Знайте, когда не использовать regex
Regex — неподходящий инструмент для разбора HTML, XML, JSON или любой вложенной структуры. Используйте для этого подходящий парсер.
Совет Тестируйте и отлаживайте regex-шаблоны в реальном времени: Как тестировать regex-шаблоны. Вставьте шаблон и тестовые данные — совпадения подсвечиваются мгновенно.
Начните тестировать regex прямо сейчас:
Бесплатно, мгновенная обратная связь, без регистрации.