DevToolPal
RU

Тестер регулярных выражений PCRE

Проверка регулярных выражений PHP / Perl на настоящем движке PCRE2: рекурсия, захватывающие квантификаторы, \K и не только.

Работает локально, без загрузки на сервер

Параметры

Тестовая строка

Символов: 0 · 0 B

Результат

Здесь появится результат

Что делает этот инструмент

Тестер регулярных выражений PCRE проверяет регулярное выражение на вашем тексте с помощью настоящей библиотеки PCRE2 — того же движка, что используют PHP, инструменты в стиле Perl и многие веб-серверы. Совпадения подсвечиваются, каждое из них выводится в списке с позицией и группами захвата, а необязательная замена показывает результат подстановки в стиле preg_replace.

Проверка на настоящем движке важна, потому что регулярные выражения PCRE и JavaScript различаются в мелких, но существенных деталях. Шаблон, работающий в браузерном тестере, может не скомпилироваться в PHP или находить что-то другое.

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

  1. Введите шаблон без разделителей в поле Шаблон PCRE.
  2. Вставьте текст для поиска в поле Тестовая строка.
  3. Включите нужные модификаторы: g для всех совпадений (как preg_match_all), i, m, s, x, U и u для учитывающих Unicode \w, \d и \b.
  4. При желании заполните Заменить на, чтобы увидеть результат подстановки. Используйте $1 или ${1} для нумерованных групп, ${name} для именованных и $0 для всего совпадения.

Для некорректных шаблонов выводится собственное сообщение об ошибке PCRE2 и позиция в шаблоне, на которой разбор остановился.

Пример

Шаблон по умолчанию \((?:[^()]++|(?R))*\) находит сбалансированные скобки. Он совпадает с парой скобок, внутри которых либо символы, не являющиеся скобками, либо — рекурсивно — снова весь шаблон. В тексте примера он находит (a, g(b, c)) и ((x), y) и пропускает незакрытую скобку в конце. На регулярных выражениях JavaScript такое не выразить.

Попробуйте (?<amount>\d+(?:\.\d+)?)\s+(?<cur>USD|EUR) с заменой ${cur} $1, чтобы поменять местами суммы и коды валют во второй строке.

Возможности PCRE, о которых стоит знать

  • Захватывающие квантификаторы (*+, ++, ?+) и атомарные группы ((?>...)) никогда не отдают обратно то, что уже захватили, что предотвращает лавинообразный перебор с возвратами.
  • \K сбрасывает начало совпадения — простая альтернатива ретроспективной проверке (lookbehind).
  • Рекурсия через (?R), (?1) или (?&name) находит вложенные структуры.
  • Встроенные модификаторы, например (?i), меняют поведение для части шаблона.

Советы

  • В PHP оберните шаблон в разделители, например /.../ или ~...~, и выберите такой, который не встречается в шаблоне, — тогда его не придётся экранировать.
  • Включайте u, если в тексте есть буквы с диакритикой или символы CJK, чтобы \w находил и их.

Частые вопросы

› Чем этот инструмент отличается от тестера регулярных выражений JavaScript?

Эта страница запускает PCRE2 — движок, на котором работают функции preg_ в PHP, Nginx, Apache и многие другие инструменты, — скомпилированный в WebAssembly. Он поддерживает синтаксис, которого нет в JavaScript: рекурсию через (?R), захватывающие квантификаторы вроде a++, атомарные группы, \K, группы (?P<name>...) и модификаторы x и U.

› Нужно ли вводить разделители, например /pattern/i?

Нет. Вводите только сам шаблон, а модификаторы включайте флажками. В PHP `preg_match('/\d+/i', $s)` соответствует шаблону `\d+` с включённым «Без учёта регистра».

› Почему я получил "match limit exceeded"?

Некоторые шаблоны, например ^(a+)+$ на длинной несовпадающей строке, выполняют экспоненциальное число возвратов (backtracking). Тестер останавливается после пяти миллионов шагов, чтобы страница не зависала. В PHP есть похожая защита — pcre.backtrack_limit, и при её срабатывании preg_match возвращает false.

› Загружается ли мой текст на сервер?

Нет. Модуль PCRE2 на WebAssembly скачивается один раз, а всё остальное выполняется в вашем браузере.