Что делает этот инструмент
Тестер регулярных выражений PCRE проверяет регулярное выражение на вашем тексте с помощью настоящей библиотеки PCRE2 — того же движка, что используют PHP, инструменты в стиле Perl и многие веб-серверы. Совпадения подсвечиваются, каждое из них выводится в списке с позицией и группами захвата, а необязательная замена показывает результат подстановки в стиле preg_replace.
Проверка на настоящем движке важна, потому что регулярные выражения PCRE и JavaScript различаются в мелких, но существенных деталях. Шаблон, работающий в браузерном тестере, может не скомпилироваться в PHP или находить что-то другое.
Как пользоваться
- Введите шаблон без разделителей в поле Шаблон PCRE.
- Вставьте текст для поиска в поле Тестовая строка.
- Включите нужные модификаторы: g для всех совпадений (как preg_match_all), i, m, s, x, U и u для учитывающих Unicode
\w,\dи\b. - При желании заполните Заменить на, чтобы увидеть результат подстановки. Используйте
$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 скачивается один раз, а всё остальное выполняется в вашем браузере.