Инструмент тестирования регулярных выражений
Тестирование и отладка регулярных выражений в реальном времени с подсветкой результатов и генерацией кода
Что такое регулярное выражение?
Инструмент Regex помогает писать, тестировать и понимать регулярные выражения. Регулярное выражение описывает текстовые шаблоны для поиска, извлечения, проверки и замены: похожие на email строки, поля логов, URL, ID, даты или повторяющееся форматирование. Тестер показывает совпадения, capture groups, flags и пограничные случаи до использования шаблона в коде, data pipeline или форме. Regex мощен, но его легко переоценить: шаблон может находить слишком много или слишком мало, тормозить на больших входах или плохо учитывать Unicode и локальные правила. Для сложных парсеров, HTML и критичной валидации часто безопаснее специализированная библиотека. Для production-данных или кодовой базы результат все равно нужно проверить parser, тестами или правилами проекта.
Как использовать
Как использовать
- Введите regex-шаблон в левое поле ввода
- Выберите нужные флаги (например, g для глобального поиска, i для поиска без учёта регистра)
- Введите тестовый текст в правом поле
- Просмотрите подсвеченные совпадения и сведения о них
Советы по regex
- Тестируйте шаблоны на примерах как с совпадениями, так и без них — так будет проще обнаружить слишком широкие выражения.
- Будьте осторожны с вложенными квантификаторами на длинном тексте: некоторые шаблоны могут работать медленно из-за чрезмерного отката.
Применение
Технический принцип
Тестер работает на движке ECMAScript RegExp, определённом в спецификации языка. Регулярные выражения ECMAScript — это реализация NFA с возвратом (backtracking): движок пробует каждую альтернативу слева направо и откатывается при неудаче квантификатора, что делает возможными lookaround и обратные ссылки, но также порождает катастрофический возврат на враждебных входных данных. Шесть распознаваемых флагов: g (глобальный), i (без учёта регистра), m (многострочный, привязки по строкам), s (dotAll, '.' совпадает с переводом строки), u (режим Unicode) и y (sticky, привязка к lastIndex). Семантика совпадений резко меняется в зависимости от флагов. С флагом /u движок рассматривает шаблон как последовательность Unicode code points, а не UTF-16 code units, поэтому суррогатные пары совпадают как один символ, а Unicode property classes вроде \p{L} (любая буква), \p{Sc} (символ валюты) и \p{Script=Han} становятся доступны. Именованные группы захвата (?<name>...) и lookbehind (?<=...) входят в ES2018 и поддерживаются в Chromium 64+, Firefox 78+ и Safari 16.4+, но такие возможности PCRE как атомарные группы (?>...) и possessive quantifiers (a++) по-прежнему не входят в спецификацию. Наибольшая production-опасность — это ReDoS: шаблон вроде (a+)+b на входе 'aaaaaaaaaaaaaaaa!' порождает экспоненциальное число путей, поскольку два вложенных квантификатора могут разбить одну последовательность символов множеством способов. Меры профилактики хорошо известны: избегать вложенных квантификаторов над одним и тем же классом символов, использовать привязки ^ и $ где возможно, предпочитать атомарные группы при поддержке движком, или переключиться на линейный движок, например RE2 от Go (который жертвует обратными ссылками и lookbehind ради гарантированного O(n) совпадения). Для ненадёжного входа, предназначенного для серверной валидации, RE2 или написанный вручную парсер почти всегда более безопасный выбор.
- Движок: ECMAScript RegExp — это NFA с возвратом, а не DFA; именно это делает возможными lookaround и обратные ссылки, но также делает возможным катастрофический возврат.
- Флаги: g (глобальный), i (без учёта регистра), m (^/$ по строкам), s (dotAll, '.' совпадает с \n), u (режим Unicode, учитывающий суррогаты), y (sticky, привязка к lastIndex).
- Режим Unicode: /u открывает совпадение по code points и доступ к \p{L} (буква), \p{Sc} (валюта), \p{Script=Han}; без /u шаблон [a-zA-Z]+ пропускает любое не-латинское слово.
- Доступность современного синтаксиса: именованные группы захвата (?<n>...) и lookbehind (?<=...) поддерживаются в Chromium 64+, Firefox 78+, Safari 16.4+; атомарные группы (?>...) и possessive quantifiers (a++) не входят в ECMAScript.
- ReDoS: вложенные квантификаторы над одним классом, такие как (a+)+b, экспоненциально разрастаются; ужесточите привязками, атомарными группами или перейдите на RE2 / re2-wasm для ненадёжного входа.
- Нижняя граница сложности: литеральные привязанные шаблоны над фиксированным алфавитом работают за O(n); обратные ссылки и неограниченные lookaround в худшем случае приводят к экспоненциальной сложности, поэтому тестируйте на враждевном входе перед релизом.
Примеры
Сопоставление email-адреса
Шаблон: ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
Флаги: gi
Вход: contact: alice@example.com, bob_2024@mail.co.uk, invalid@.com
Совпадения: alice@example.com, bob_2024@mail.co.uk (2 совпадения)Извлечение IPv4-адресов из лога
Шаблон: \b(?:\d{1,3}\.){3}\d{1,3}\b
Флаги: g
Вход: 2026-06-15 ERROR client 192.168.1.42 connect failed (peer 10.0.0.1)
Совпадения: 192.168.1.42, 10.0.0.1Захват частей даты с именованными группами
Шаблон: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
Флаги: g
Вход: Sprint window: 2026-09-01 to 2026-09-15
Группы: {year:'2026', month:'09', day:'01'}, {year:'2026', month:'09', day:'15'}Жадный и ленивый квантификаторы
Вход: <b>hello</b> <i>world</i>
.* (жадный) -> сопоставляет всю строку: <b>hello</b> <i>world</i>
.*? (ленивый) -> только первое совпадение: <b>hello</b>
Ленивый — это то, что обычно нужно при извлечении данных между тегами.Класс букв с поддержкой Unicode
Шаблон: \p{L}+
Флаги: gu
Вход: Hello, 北京! Café Москва
Совпадения: Hello, 北京, Café, Россия
Без флага u и \p{L}, [a-zA-Z]+ пропустил бы каждое нелатинское слово.Часто задаваемые вопросы
Какой диалект регулярных выражений использует тестер?
Движок регулярных выражений JavaScript (ECMAScript). Для большинства возможностей он похож на PCRE, но различается в краях: нет посессивных квантификаторов, нет рекурсии, lookbehind работает только в современных браузерах, именованные группы записываются как (?<name>...). Для Python (re/regex), Java, .NET или PCRE поведение того же шаблона может отличаться — обязательно проверяйте в целевой среде.
Какие флаги поддерживаются?
g (глобальный, ищет все совпадения), i (без учёта регистра), m (многострочный, ^ и $ совпадают с границами строк), s (dotall, точка совпадает с переводом строки), u (Unicode), y (sticky), d (hasIndices). Включайте их в строке переключателей; страница показывает, как каждый флаг меняет поведение на вашем тестовом тексте.
Почему мой шаблон находит меньше совпадений, чем ожидалось?
Без флага g функция regex.exec возвращает только одно совпадение. Без m символы ^ и $ совпадают только с самым началом и концом всего ввода. Без u символы из суррогатных пар (эмодзи) рассматриваются как две половины. Большинство проблем «почему это не работает» — это пропущенные флаги.
Как искать эмодзи и иероглифы CJK?
Включите флаг u, чтобы корректно работать с Unicode. Используйте классы символов \p{...} (\p{Letter}, \p{Script=Han}, \p{Emoji}), чтобы искать по свойствам Unicode. Без u класс [a-zA-Z] не совпадает с буквами с диакритикой — либо расширьте до [a-zA-ZÀ-ÿ], либо используйте \p{L}.
Можно ли сгенерировать код по шаблону?
Большинство сборок экспортируют шаблон в синтаксисе JavaScript, Python, PHP, Ruby, Go или Java с нужным экранированием. Но имейте в виду: один и тот же шаблон может вести себя по-разному в разных движках (значения жадности по умолчанию, классы символов, поддержка lookaround). Всегда проверяйте в целевом языке.
Чем отличаются жадные и ленивые квантификаторы?
Жадные (* + ?) захватывают как можно больше, а потом откатываются при необходимости. Ленивые (*? +? ??) захватывают как можно меньше. Для задачи «извлечь всё между A и B» жадный .* «перепрыгнет» через несколько B; ленивый .*? остановится на первом же B. По умолчанию для извлечения внутреннего содержимого выбирайте ленивый вариант.
Загружается ли мой регекс или текст для теста?
Нет. Сопоставление выполняется в вашем браузере встроенным движком регулярных выражений JavaScript. Шаблоны и входные данные никуда не передаются.