Почему регулярное выражение не работает: Флаги, многострочные якоря и экранирование
Содержание
- Прямая диагностика: почему синтаксически верный Regex не работает
- Ключевые флаги: g, i, m и s (не путайте m и s)
- Жадные (.*) и ленивые (.*?) квантификаторы
- Экранирование символов и ловушка обратного слеша (Литеральный контекст vs Символьные классы)
- Проверенные на практике примеры в GoToolstack
- Различия движков и защита от ReDoS
- Инструменты GoToolstack для разработчиков
- Технические стандарты и официальные спецификации
1. Прямая диагностика: почему синтаксически верный Regex не работает
Регулярное выражение без синтаксических ошибок часто дает сбой из-за отсутствия нужных флагов, несовпадения границ строк или некорректного экранирования. Если выражение возвращает 0 совпадений или захватывает весь документ целиком вместо отдельного слова, движок интерпретирует входящую строку иначе, чем вы предполагаете.
Перед изменением шаблона последовательно проверьте четыре базовых механизма:
2. Ключевые флаги: g, i, m и s (не путайте m и s)
Флаги управляют правилами сопоставления: g находит все совпадения; i отключает регистрозависимость; m заставляет ^ и $ срабатывать на каждой строке; s позволяет точке совпадать с переносами строк.

- g (Глобальный поиск): Продолжает поиск по всей строке вместо остановки на первом совпадении.
- i (Игнорирование регистра): Отключает чувствительность к регистру символов.
- m (Многострочный режим): Заставляет
^и$находить начало и конец каждой отдельной строки. - s (dotAll): Позволяет точке (
.) находить символы переноса строки (\n,\r).
КЛЮЧЕВОЕ РАЗЛИЧИЕ: Многострочный флаг (m) НЕ позволяет точке (.) пересекать переносы строк! И наоборот, флаг dotAll (s) не заставляет ^ и $ срабатывать на границах отдельных строк. Путаница между m и s — главная причина ошибок.
3. Жадные (.*) и ленивые (.*?) квантификаторы
По умолчанию квантификаторы являются жадными (greedy): они захватывают максимально длинную последовательность символов перед возвратом назад.
Попытка извлечь теги из: <div>Один</div><div>Два</div>
Жадный шаблон <div>.*</div>: Захватывает текст от первого открывающего до самого последнего закрывающего тега одним огромным куском.
Ленивый шаблон <div>.*?</div>: Знак вопроса делает квантификатор ленивым (lazy), останавливая его на первом закрывающем теге (<div>Первый</div>). Однако для извлечения обоих независимых совпадений из строки необходимо указать глобальный флаг (g) (/<div>.*?</div>/g). Без флага g движок завершает поиск сразу после первого совпадения.
4. Экранирование символов и ловушка обратного слеша (Литеральный контекст vs Символьные классы)
Регулярные выражения резервируют служебные символы: \ ^ $ . | ? * + ( ) [ { } ]. Правила экранирования строго зависят от контекста:
- Вне символьных классов: Все служебные символы требуют экранирования обратным слешем (например,
\.,\$) для буквального совпадения. - Внутри символьных классов (
[...]): Большинство метасимволов теряют спецзначение и совпадают буквально (например,[.]совпадает с точкой, а[*]— со звездочкой). Только^(отрицание в начале),-(диапазон),](конец класса) и\(экранирование) сохраняют синтаксическую роль.
В коде JavaScript четко разделяйте литерал и строковый конструктор:
// 1. Regex Literal (single backslash required)
const reLiteral = /^\d+\.\d+$/;
// 2. String Constructor (double backslash mandatory)
const reConstructor = new RegExp("^\\d+\\.\\d+$");5. Проверенные на практике примеры в GoToolstack
Примеры верифицированы в нативном движке ECMAScript с реальными входными строками:
| Сценарий и входные данные | Шаблон и флаги | Подтвержденное совпадение |
|---|---|---|
ERROR 404 /api\nINFO 200 /home\nERROR 500 /db |
/^ERROR\s+(\d+)/gm |
ERROR 404, ERROR 500 |
Total cost: $49.99 USD |
/\$(\d+\.\d{2})/ |
$49.99 |
/* Multi-line |
/\/\*.*?\*\//s |
/* Multi-line |
6. Различия движков и защита от ReDoS
Тестировщик GoToolstack работает на встроенном движке браузера. Учитывайте следующие отличия от PCRE и Python:
- Ретроспективные проверки (Lookbehind): Поддерживаются в ES2018+
(?<=...), но вызывают сбой в старых версиях. - Нет сверхжадных квантификаторов: В JavaScript отсутствуют
.*+и атомарные группировки. - Защита от ReDoS: Шаблоны вроде
(a+)+$приводят к катастрофическому возврату и зависанию вкладки. Наш инструмент запускает код в Web Worker с автоматическим тайм-аутом. - Миф об идеальном Regex для почты: Не используйте многостраничные выражения для стандарта RFC 5322. Базовой проверки формата и письма с подтверждением вполне достаточно.
7. Инструменты GoToolstack для разработчиков
Тестируйте и создавайте регулярные выражения безопасно в браузере без отправки данных на сервер: