Регулярные выражения (RegEx)
См. также: глоссарий — регулярные выражения · готовые паттерны · Bash — однострочники и скрипты · JavaScript — RegExp · Python — модуль re · Bash — =~ и grep · терминал — поиск в файлах (grep) · Linux — краткий grep
RegEx — шаблон для текста
Что такое RegEx?
RegEx (сокращение от Regular Expressions, по-русски — регулярные выражения) — это специальный язык графических шаблонов, который используется для быстрого поиска, проверки и изменения текста.
Вы можете искать информацию в тексте обычной командой Ctrl+F, а можете использовать максимально прокаченный способ, позволяющий дать сложные условия, например "слово из 5 букв, которое начинается на к, заканчивается на т, а в середине имеет цифры".
Язык регулярных выражений состоит из специальных символов-инструкций. Например:
\d— означает "любая цифра" (от 0 до 9).\w— означает "любая буква или цифра".+— означает "один или более раз".^— начало строки,$— конец строки.
Вот и собирают для поиска такую формулу, типа:
[А-Я]\d{3}[А-Я]{2}
Например, выше - поиск автомобильного госномера (А123БВ).
Регулярное выражение (RegEx, regexp) — компактная запись правила поиска и замены в строке. Одним шаблоном можно проверить формат телефона, вытащить дату из лога, отфильтровать строки в grep или задать атрибут pattern в HTML-форме.
Шаблон собирается из литералов (буквы и цифры "как есть") и метасимволов (точка, квантификаторы, классы символов). Движок сопоставляет шаблон с текстом слева направо; при совпадении возвращает фрагмент или группы для подстановки.
Синтаксис близок во многих языках, но детали расходятся — именованные группы, lookbehind, флаги Unicode.
В Python — модуль re (синтаксис близок к Perl); в JavaScript — тип RegExp; в grep по умолчанию — POSIX ERE/BRE. Перед продакшеном сверяйте шаблон с документацией своего движка.
Теоретическая основа — регулярные языки (тип 3 в иерархии Хомского): те же классы строк, что задаёт конечный автомат. RegEx удобны для лексического разбора и валидации форматов, но не заменяют парсеры JSON, HTML или SQL.
Быстрый старт
Типичный цикл из трёх шагов:
- Написать простой шаблон и проверить "есть ли совпадение".
- Добавить группы
(...), если нужно извлечь части строки. - Перейти к замене, когда задача — преобразовать текст, а не только найти.
Телефон: +7 (999) 123-45-67
Шаблон: \D → удалить всё, кроме цифр
Шаблон: ^7\d{10}$ → ровно 11 цифр, первая — 7
В JavaScript тот же приём выглядит как replace(/\D/g, '') и test(/^7\d{10}$/).
Основы
| Конструкция | Смысл |
|---|---|
. | Любой символ, кроме перевода строки (если нет флага "точка = всё", см. ниже) |
a | Символ a буквально |
ab | Подстрока ab |
a|b | a или b |
a* | Ноль и более a подряд |
\ | Экранирует метасимвол: \. — точка, а не "любой символ" |
Литералы совпадают сами с собой. Метасимволы нужно экранировать обратным слешем, если вы хотите их буквальное значение.
Квантификаторы
| Конструкция | Смысл |
|---|---|
* | Ноль и более предыдущего элемента |
+ | Один и более |
? | Ноль или один |
{2} | Ровно 2 повторения |
{2,5} | От 2 до 5 включительно |
{2,} | Два и более |
{,5} | До 5 включительно |
По умолчанию квантификаторы жадные (greedy): берут максимально длинное совпадение. Ленивый (reluctant) режим — добавить ? после квантификатора — *?, +?, {2,5}? — минимально возможное совпадение.
Пример: в строке <b>жирный</b> шаблон <.*> захватит всё от первого < до последнего >; <.*?> остановится на первом >.
Группы
| Конструкция | Смысл |
|---|---|
(...) | Захватывающая группа — попадает в результат под номером 1, 2, … |
(?:...) | Группировка без захвата |
(?P<имя>...) | Именованная группа (Python, часть других движков) |
(?<имя>...) | Именованная группа (JavaScript) |
\1, \2 | Ссылка на группу по номеру в том же шаблоне |
(?P=имя) | Совпадение с уже захваченной именованной группой (Python) |
(?#комментарий) | Комментарий внутри шаблона (Python, флаг x) |
Группы нужны и для извлечения данных, и для повторения фрагмента: (\d{2})-\1 найдёт 12-12, если обе части одинаковы.
Классы символов
| Конструкция | Смысл |
|---|---|
[ab-d] | Один символ из набора: a, b, c, d |
[^ab-d] | Один символ вне набора |
[\b] | Символ backspace (внутри класса) |
\d | Цифра [0-9] |
\D | Не цифра |
\s | Пробельный символ (пробел, таб, перевод строки и т.д.) |
\S | Не пробельный |
\w | "Словесный" символ (буква, цифра, _; точное определение зависит от движка) |
\W | Не "словесный" |
Внутри [...] большинство метасимволов теряют особый смысл; диапазоны задают через дефис: [A-Za-z0-9_].
Утверждения (assertions)
Утверждения проверяют контекст вокруг совпадения, не расходуя символы входа (кроме lookbehind с переменной длиной в части движков).
| Конструкция | Смысл |
|---|---|
^ | Начало строки (или начало строки в режиме многострочности) |
$ | Конец строки |
\A | Начало всего текста (Python; игнорирует флаг m) |
\Z | Конец всего текста (Python) |
\b | Граница слова |
\B | Не граница слова |
(?=...) | Позитивный lookahead — дальше должно совпасть ... |
(?!...) | Негативный lookahead — дальше не должно совпасть |
(?<=...) | Позитивный lookbehind — слева должно совпасть |
(?<!...) | Негативный lookbehind |
Пример lookahead: пароль с цифрой — ^(?=.*\d).{8,}$ (минимум 8 символов и хотя бы одна цифра где угодно в строке).
Условные конструкции (?(условие)да|нет) есть в расширенных диалектах; в повседневном коде встречаются редко.
Флаги
Флаги задают режим сопоставления. В JavaScript их пишут после литерала /шаблон/flags; в Python — третьим аргументом re.compile(..., flags=re.I) или (?i) внутри шаблона.
| Флаг | Назначение |
|---|---|
i | Без учёта регистра |
m | ^ и $ привязаны к строкам внутри многострочного текста |
s | . совпадает и с переводом строки (JavaScript s, Python re.DOTALL) |
x | Пробелы вне классов игнорируются, допускаются комментарии (?#...) |
u | Unicode-классы, корректная работа с суррогатными парами |
g | Все совпадения, не только первое (JavaScript) |
L | Локальные классы символов (редко) |
Встроенная установка в шаблоне (Python): (?im) в начале или (?iLmsux-imsx:подшаблон) для части выражения.
Спецсимволы и escape-последовательности
| Конструкция | Смысл |
|---|---|
\n | Перевод строки |
\r | Возврат каретки |
\t | Табуляция |
\YYY | Символ по восьмеричному коду (зависит от движка) |
\xYY | Символ по шестнадцатеричному коду |
В строках языка программирования обратный слеш часто экранируется дважды — в Python r"\d+", в JavaScript-строке "\\d+", в литерале RegExp — /\d+/.
Замена и подстановки
При replace / sub в строку подстановки попадают ссылки на группы:
| Движок | Вставить всё совпадение | Группа 1 | Именованная группа |
|---|---|---|---|
| JavaScript | $& | $1 | $<имя> |
Python re.sub | \g<0> | \1 | \g<имя> |
| .NET | $0 | $1 | ${имя} |
| sed (GNU) | & | \1 | — |
В JavaScript колбэк во втором аргументе replace удобен, когда подстановка зависит от логики, а не только от номера группы.
Где применяется в энциклопедии
| Область | Механизм | Статья |
|---|---|---|
| Готовые шаблоны с разбором | email, телефон, лог, IP, Python/JS | Regex — готовые паттерны |
| Клиентский код | RegExp, методы строк | RegExp в JavaScript |
| Скрипты и данные | re.findall, re.sub | Python — re, pandas — str.contains |
| Shell | grep, sed, [[ =~ ]] | Справочник Linux, Bash |
| HTML-формы | атрибут pattern (подмножество JS RegExp) | Справочник <input> |
| SQL | LIKE с % и _ — не полный RegEx | Операторы WHERE |
| Безопасность | валидация входа, фильтры WAF | Основы ИБ |
LIKE в SQL — отдельный мини-язык: % — любая длина, _ — ровно один символ. Для сложных масок в PostgreSQL есть ~ / ~* (POSIX regex); в других СУБД — свои операторы (REGEXP в MySQL и т.д.).
Ограничения и типичные ошибки
- HTML, XML, JSON — вложенная структура; нужен парсер, а не один большой шаблон.
- Email и URL "на 100 %" — в продакшене опирайтесь на типы полей HTML, библиотеки и серверную проверку.
- Катастрофический backtracking — вложенные квантификаторы вроде
(a+)+на длинном вводе "подвешивают" процесс; упрощайте шаблон или ограничивайте длину строки.
| Задача | Разумный подход |
|---|---|
| Простая маска (телефон, код) | Короткий RegEx + нормализация ввода |
| Поля формы в браузере | type, pattern, Constraint Validation API |
| Поиск в логах на сервере | grep -E, при сложной логике — скрипт на Python |
| Разбор структурированного протокола | Парсер, грамматика, не regexp |
Краткий итог
RegEx — шаблон, флаги и операции поиск / проверка / замена. Освойте таблицы основ, квантификаторов и классов символов, затем переходите к языковым статьям — синтаксис групп и подстановок в вашем движке чуть отличается, а идея одна — описать правило текста один раз и переиспользовать в коде, формах и терминале. Готовые шаблоны с построчным разбором — в лаборатории "Regex — готовые паттерны".