Регулярные выражения (RegEx)
См. также: глоссарий — регулярные выражения · JavaScript — RegExp · Python — модуль re · Bash — =~ и grep · терминал — grep
RegEx — шаблон для текста
Регулярное выражение (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 удобен, когда подстановка зависит от логики, а не только от номера группы.
Где применяется в энциклопедии
| Область | Механизм | Статья |
|---|---|---|
| Клиентский код | 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 — шаблон, флаги и операции поиск / проверка / замена. Освойте таблицы основ, квантификаторов и классов символов, затем переходите к языковым статьям: синтаксис групп и подстановок в вашем движке чуть отличается, а идея одна — описать правило текста один раз и переиспользовать в коде, формах и терминале.
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Что такое код и как он работает - от представления инструкций до компиляции, выполнения и взаимодействия с системой. Теория представления кода - как информация кодируется, передается и искажается в реальных каналах хранения и связи. Ключевые слова (keywords) — это зарезервированные слова в языке программирования, которые имеют специальное значение и не могут использоваться как имена переменных или функций. Что такое операторы, какими они бывают. Действия над данными. Если после имени следует пара круглых скобок — это вызов функции. Если скобок нет — это обращение к значению (переменной, константе, параметру и т. д.). Отсутствие значения — это фундаментальная концепция в программировании, отражающая состояние, когда данные ожидаются, но в текущий момент недоступны. Циклы в программировании - виды повторений, условия завершения и типичные сценарии применения. Высокоуровневые и низкоуровневые языки — абстракция, переносимость, ассемблер и компромисс с производительностью. Синтаксический сахар - конструкции языка, повышающие читаемость кода без изменения вычислительной сути. Единые правила написания. Что такое стиль кода, и как его оформляют. Что делают с кодом, чтобы повысить его надёжность, читаемость и расширяемость. Что такое рефакторинг, как он работает и из чего состоит.Что такое код и как он работает
Теория представления кода
Ключевые слова в языках программирования
Операторы
Функции
Обработка значения null
Циклы
Уровни абстракции языков программирования
Синтаксический сахар
Стили оформления кода
Приёмы написания кода
Методы рефакторинга программного кода