Главная › Blog › Устранение ошибок Regex
Инструменты разработки

Почему регулярное выражение не работает: Флаги, многострочные якоря и экранирование

Опубликовано: 17 октября 2026 • Обновлено: 17 октября 2026 • Автор: Инженерная группа GoToolstack • Протестировано в тестере регулярных выражений GoToolstack
Тестируйте регулярные выражения в реальном времени: Мгновенная подсветка совпадений, разбор групп захвата и защита от зависаний ReDoS прямо в браузере.
Открыть тестер Regex
Содержание
  1. Прямая диагностика: почему синтаксически верный Regex не работает
  2. Ключевые флаги: g, i, m и s (не путайте m и s)
  3. Жадные (.*) и ленивые (.*?) квантификаторы
  4. Экранирование символов и ловушка обратного слеша (Литеральный контекст vs Символьные классы)
  5. Проверенные на практике примеры в GoToolstack
  6. Различия движков и защита от ReDoS
  7. Инструменты GoToolstack для разработчиков
  8. Технические стандарты и официальные спецификации

1. Прямая диагностика: почему синтаксически верный Regex не работает

Регулярное выражение без синтаксических ошибок часто дает сбой из-за отсутствия нужных флагов, несовпадения границ строк или некорректного экранирования. Если выражение возвращает 0 совпадений или захватывает весь документ целиком вместо отдельного слова, движок интерпретирует входящую строку иначе, чем вы предполагаете.

Перед изменением шаблона последовательно проверьте четыре базовых механизма:

2. Ключевые флаги: g, i, m и s (не путайте m и s)

Флаги управляют правилами сопоставления: g находит все совпадения; i отключает регистрозависимость; m заставляет ^ и $ срабатывать на каждой строке; s позволяет точке совпадать с переносами строк.

Механика флагов и сопоставления якорей регулярных выражений
Рис. 1: Сравнение работы якорей regex: границы всей строки против многострочного режима (/m).
  • 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
  comment */
/\/\*.*?\*\//s /* Multi-line
  comment */

6. Различия движков и защита от ReDoS

Тестировщик GoToolstack работает на встроенном движке браузера. Учитывайте следующие отличия от PCRE и Python:

  • Ретроспективные проверки (Lookbehind): Поддерживаются в ES2018+ (?<=...), но вызывают сбой в старых версиях.
  • Нет сверхжадных квантификаторов: В JavaScript отсутствуют .*+ и атомарные группировки.
  • Защита от ReDoS: Шаблоны вроде (a+)+$ приводят к катастрофическому возврату и зависанию вкладки. Наш инструмент запускает код в Web Worker с автоматическим тайм-аутом.
  • Миф об идеальном Regex для почты: Не используйте многостраничные выражения для стандарта RFC 5322. Базовой проверки формата и письма с подтверждением вполне достаточно.

7. Инструменты GoToolstack для разработчиков

Тестируйте и создавайте регулярные выражения безопасно в браузере без отправки данных на сервер:

Технические стандарты и официальные спецификации