Тестер регулярных выражений: как проверить regex на тексте и не повесить страницу

Регулярное выражение написано, но непонятно, что оно находит на реальном тексте. Совпадения вроде есть, но какие именно группы сработали и на каких позициях? А если выражение «тяжёлое», тестер может повесить вкладку на минуту. Тестер регулярных выражений проверяет regex JavaScript на вашем тексте: совпадения подсвечиваются сразу при вводе, для каждого видны позиция, нумерованные и именованные группы. Можно проверить и замену со ссылками на группы ($1, $), а выражение выполняется в отдельном потоке браузера с ограничением времени — «тяжёлое» выражение не повесит страницу.

В этой статье разберём, какой синтаксис поддерживается, что значит «выражение выполняется слишком долго», как ссылаться на группы в замене и зачем включать флаг u.

Интерфейс онлайн-инструмента Тестер регулярных выражений
Интерфейс онлайн-инструмента Тестер регулярных выражений

Что умеет тестер

Тестер регулярных выражений принимает выражение, флаги и текст для проверки.

Параметр Что делает
Регулярное выражение Выражение без косых черт по краям
Флаги g, i, m, s, u, y
Текст для проверки Текст, на котором проверяется выражение
Заменить Строка замены со ссылками на группы
Проверять при вводе Обновляет результат по мере ввода
Результат Совпадения, позиции, группы, время выполнения

Для каждого совпадения показываются позиция, сам текст совпадения и группы: нумерованные ($1, $2) и именованные ($).

Всё выполняется в браузере: текст никуда не отправляется.

Флаги: что включает каждый

Флаги меняют поведение выражения. Отметить можно несколько.

Флаг Что делает
g Ищет все совпадения, а не только первое
i Без учёта регистра
m Многострочный режим: ^ и $ работают для каждой строки
s Точка . соответствует и переводу строки
u Юникод: символы целиком, классы \p{L}, строгий синтаксис
y Поиск с указанной позиции (sticky)

Для текста на русском флаг u лучше включать: с ним выражение работает с символами Юникода целиком, понимает \p{L} и другие классы Юникода и строже относится к ошибкам в синтаксисе.

Синтаксис: JavaScript, а не PCRE

Тестер использует синтаксис регулярных выражений JavaScript (ECMAScript) — тот же, что в браузерах и Node.js.

Поддерживается Не поддерживается
Именованные группы (?…) Атомарные группы
Lookahead и lookbehind Притяжательные квантификаторы
Классы Юникода \p{L} с флагом u Модификатор x (расширенный режим)
Обратные ссылки Некоторые конструкции PCRE

Синтаксис почти совпадает с PCRE в PHP, но не полностью. Если выражение писалось для PHP, проверьте его в тестере — часть конструкций может не поддерживаться.

Катастрофический возврат: почему выражение «зависает»

Самая опасная проблема регулярных выражений. Выражение с вложенными квантификаторами вроде (a+)+ на неподходящем тексте перебирает экспоненциально растущее число вариантов. Это называется катастрофическим возвратом (catastrophic backtracking).

На практике: выражение работает мгновенно на коротком тексте и зависает на длинном, где почти совпадает, но не совпадает. На сайте такое выражение может остановить сервер.

Тестер защищает: выражение выполняется в отдельном потоке браузера с ограничением времени 2 секунды. Если лимит превышен, появляется сообщение «выражение выполняется слишком долго» — страница не зависает.

Что делать, если это произошло:

Причина Решение
Вложенные квантификаторы (a+)+ Убрать вложенность
Неоднозначные альтернативы Сделать части взаимоисключающими
Жадные квантификаторы на большом тексте Использовать ленивые (*?, +?) или ограничить
Слишком общее выражение Уточнить шаблон

Замена со ссылками на группы

Инструмент позволяет проверить не только поиск, но и замену. В строке замены можно ссылаться на группы.

Ссылка Что означает
$1, $2 … Нумерованные группы
$ Именованная группа
$& Всё совпадение
$` Текст до совпадения
$" Текст после совпадения
$$ Знак доллара

Это удобно, когда нужно переформатировать текст: например, поменять местами части совпадения или обернуть найденное в тег.

Именованные группы: зачем они нужны

Нумерованные группы ($1, $2) зависят от порядка скобок в выражении. Если добавить новую группу в середину, нумерация сдвинется, и ссылки в замене сломаются.

Именованные группы решают эту проблему: (?…) и (?…) дают стабильные имена, и ссылка $ не зависит от порядка.

Тип группы Пример Ссылка в замене
Нумерованная ([\w.+-]+) $1
Именованная (?[\w.+-]+) $

Для сложных выражений именованные группы читаемее и надёжнее.

Зачем тестировать регулярные выражения

Задача Что даёт тестер
Проверка шаблона Увидеть, что именно находит выражение
Отладка групп Понять, какая группа сработала
Проверка замены Убедиться, что замена работает как задумано
Поиск катастрофического возврата Увидеть, что выражение зависает, до публикации
Подбор флагов Проверить поведение с g, i, u и другими
Обучение Увидеть, как работают группы и квантификаторы

Ограничения тестера

  • Синтаксис JavaScript. Конструкции PCRE, не поддерживаемые в JS, не сработают.
  • Ограничение времени 2 секунды. Очень тяжёлые выражения прерываются — это защита, а не ошибка.
  • Только текст. Тестер не проверяет выражение на файлах или потоках.
  • Не заменяет тесты в коде. Для продакшена нужны юнит-тесты, а не ручная проверка.

Как пользоваться: пошагово

  1. Введите выражение без косых черт и отметьте нужные флаги.
  2. Вставьте текст для проверки — совпадения подсветятся сразу.
  3. Чтобы проверить замену, отметьте «Заменить» и введите строку замены.

Типичные ошибки

Писать выражение с косыми чертами по краям. Поле принимает выражение без /…/. Косые черты нужно убрать.

Использовать вложенные квантификаторы без необходимости. (a+)+ — частая причина катастрофического возврата. Упростите выражение.

Забывать про флаг u для русского текста. Без него выражение может работать не с символами, а с кодовыми единицами.

Ссылаться на группы по номеру в сложном выражении. При изменении порядка скобок нумерация сдвинется. Используйте именованные группы.

Путать синтаксис JavaScript и PCRE. Выражение из PHP может не работать в JS. Проверяйте в тестере.

Игнорировать время выполнения. Если выражение выполняется долго на тесте, на реальных данных оно может зависнуть.

Вопросы и ответы

Какой синтаксис используется? Синтаксис регулярных выражений JavaScript (ECMAScript) — тот же, что в браузерах и Node.js. Он почти совпадает с PCRE в PHP, но, например, не поддерживает атомарные группы, притяжательные квантификаторы и модификатор x.

Что значит «выражение выполняется слишком долго»? Скорее всего, в выражении есть вложенные квантификаторы вроде (a+)+ — на неподходящем тексте число вариантов перебора растёт экспоненциально (катастрофический возврат). На сайте такое выражение может остановить сервер, поэтому здесь его выполнение прерывается через 2 секунды. Уберите вложенные квантификаторы или сделайте части выражения взаимоисключающими.

Как сослаться на группу в замене? $1, $2 … — нумерованные группы, $ — именованная группа, $& — всё совпадение, $` и $" — текст до и после совпадения, $$ — знак доллара.

Зачем флаг u? С флагом u выражение работает с символами Юникода целиком (эмодзи, редкие иероглифы), понимает \p{L} и другие классы Юникода и строже относится к ошибкам в синтаксисе. Для текста на русском языке его лучше включать.

Можно ли проверить замену? Да, отметьте «Заменить» и введите строку замены со ссылками на группы. Результат покажет, что получится.

Почему выражение работает в PHP, но не здесь? Тестер использует синтаксис JavaScript. Некоторые конструкции PCRE в JS не поддерживаются. Проверьте выражение и при необходимости адаптируйте.

Итог

Тестер регулярных выражений — инструмент для проверки regex JavaScript на тексте: подсветка совпадений при вводе, позиции, нумерованные и именованные группы, проверка замены со ссылками на группы. Выражение выполняется в отдельном потоке с ограничением времени, поэтому «тяжёлое» выражение не повесит страницу, а текст никуда не отправляется. Помните про катастрофический возврат, включайте флаг u для русского текста и используйте именованные группы — и регулярки будут работать предсказуемо.

Предыдущая запись

Конвертер цветов HEX, RGB, HSL: как перевести цвет и проверить контраст по WCAG

Онлайн-конвертер цветов между HEX, RGB и HSL: перевод в обе стороны, выбор пипеткой, прозрачность и проверка контраста с белым и чёрным текстом по требованиям доступности WCAG. Всё выполняется в браузере.
Далее