Регулярные выражения славятся тем, что выглядят как случайный набор символов. Паттерн вроде ^[\w.-]+@[\w-]+\.\w{2,}$ может показаться результатом ходьбы кота по клавиатуре. Но за загадочным синтаксисом скрывается удивительно элегантная идея: лаконичный язык для описания шаблонов в тексте.
Будь то валидация форм, поиск по лог-файлам, очистка данных или массовый поиск с заменой в коде — regex является одним из самых универсальных инструментов в арсенале разработчика. И вам не нужно запоминать каждую малоизвестную особенность, чтобы получать реальную пользу. Несколько базовых элементов покрывают подавляющее большинство практических задач.
Что на самом деле делает regex
Регулярное выражение (regex или regexp) — это паттерн, описывающий набор строк. Вы предоставляете его поисковому движку — в вашем языке программирования, текстовом редакторе или командной строке — и он находит каждую строку, соответствующую паттерну.
Думайте об этом как о продвинутом поисковом запросе:
- Обычный поиск: найти точное слово «error»
- Поиск regex: найти всё, что похоже на IP-адрес, дату, email-адрес или любую описываемую структуру
Regex был изобретён математиком Стивеном Клини в 1956 году и вошёл в вычислительную технику через текстовые редакторы Unix в 1960-х. Сегодня он поддерживается практически в каждом языке программирования и текстовом редакторе.
Базовые элементы
Литеральные символы
Простейший regex — это обычный текст. Паттерн hello совпадает со строкой «hello» везде, где она встречается. Ничего сложного.
Точка (.) — любой символ
Точка совпадает с любым одиночным символом, кроме перевода строки.
h.tсовпадает с «hat», «hit», «hot», «h3t» и даже «h t»
Классы символов ([])
Квадратные скобки определяют набор допустимых символов на одной позиции.
[aeiou]— любая гласная[0-9]— любая цифра[A-Za-z]— любая буква[^0-9]— любой символ, который НЕ является цифрой (^внутри скобок означает «не»)
Сокращённые классы
| Сокращение | Значение | Эквивалент |
|---|---|---|
\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*c |
«ac», «abc», «abbc» |
+ |
Один или более | ab+c |
«abc», «abbc» (не «ac») |
? |
Ноль или один | colou?r |
«color» и «colour» |
{3} |
Ровно 3 | \d{3} |
«123», «456» |
{2,4} |
От 2 до 4 | \d{2,4} |
«12», «123», «1234» |
Якоря — позиция
^— начало строки (или строчки с флагомm)$— конец строки (или строчки)\b— граница слова
Паттерн ^\d{4}$ совпадает со строкой, содержащей ровно четыре цифры, например «2026», но не «abc2026» или «2026xyz».
Группы и чередование
(abc)— захватывает «abc» как группуa|b— совпадает с «a» или «b»(cat|dog)— совпадает с «cat» или «dog»
Группы также позволяют применять квантификаторы к последовательностям: (ha)+ совпадает с «ha», «haha», «hahaha».
Распространённые практические паттерны
Валидация email (базовая)
^[\w.-]+@[\w-]+\.\w{2,}$
Этот паттерн совпадает с user@example.com, first.last@company.co.uk (частично) и отклоняет строки без @ или домена.
Важно: идеальная валидация email-адресов с помощью regex — общеизвестно сложная задача, поскольку полная спецификация RFC 5322 крайне сложна. Для продакшн-систем используйте базовый regex для проверки формата, а затем подтвердите адрес, отправив письмо для подтверждения.
Совпадение с номером телефона
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Это обрабатывает форматы вроде +1 555 123 4567, 555-123-4567 и (555) 123-4567.
Совпадение с URL
https?://[\w.-]+(/[\w./?&=-]*)?
Совпадает с https://example.com, http://example.com/path?q=hello.
Совпадение с датой (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
Совпадает с 2026-03-29, 1999-12-31. Обратите внимание: проверяется только формат, а не валидность — также совпадёт с 9999-99-99.
Флаги, меняющие поведение
Большинство движков regex поддерживают флаги, изменяющие способ применения паттерна:
| Флаг | Название | Эффект |
|---|---|---|
g |
Global (глобальный) | Находить все совпадения, а не только первое |
i |
Case-insensitive (без учёта регистра) | hello совпадёт с «Hello», «HELLO» и т.д. |
m |
Multiline (многострочный) | ^ и $ совпадают с началом/концом каждой строчки |
s |
Dotall | . также совпадает с символом перевода строки |
В JavaScript флаги добавляются после закрывающего слэша: /hello/gi. В Python они передаются как аргументы: re.findall(r"hello", text, re.IGNORECASE).
Когда regex — это перебор
Regex — мощный инструмент, но не всегда подходящий:
- Парсинг HTML или XML. Используйте нормальный DOM-парсер. Regex не может надёжно обрабатывать вложенные теги.
- Парсинг JSON. Используйте
JSON.parse()или аналог. Regex сломается на краевых случаях. - Сложная валидация. Если ваш паттерн занимает несколько строк и его чтение требует пяти минут, подумайте о написании процедурного кода валидации.
- Простые строковые операции. Если вам нужен лишь
startsWith(),includes()илиsplit(), обычные строковые методы яснее и быстрее.
Распространённые подводные камни
- Забытое экранирование спецсимволов. Точка
.совпадает с любым символом. Для совпадения с буквальной точкой используйте\.. То же для(,),[,],+,*,?,{,},^,$,|и\. - Жадное и ленивое совпадение. По умолчанию
.*является жадным — совпадает с максимально возможным количеством символов. Добавьте?для ленивого варианта:.*?совпадает с минимально возможным. Это важно при извлечении содержимого между разделителями. - Катастрофический откат. Вложенные квантификаторы вроде
(a+)+могут заставить движок перебрать экспоненциальное количество путей на определённых входах, заморозив вашу программу. Избегайте вложенных повторений на перекрывающихся паттернах. - Забытые якоря. Без
^и$ваш паттерн совпадает с подстроками.\d{3}совпадёт с «123» внутри «abc12345». Используйте^\d{3}$, если нужно точное совпадение.
Узнать больше
Лучший способ изучить regex — экспериментировать. Введите паттерн, вставьте тестовый текст и посмотрите, что подсвечивается. Корректируйте и повторяйте, пока не поймёте, как работает каждый элемент.
- Как тестировать паттерны Regex — интерактивное руководство с примерами
- Тестер Regex — вставьте свой паттерн и тестовые данные, увидьте совпадения в реальном времени
