Как пользоваться: Тестер регулярных выражений
- Введите шаблон между слешами, без обрамляющих
/. - Включайте флаги, например
g (все совпадения), i (без учёта регистра) и m (многострочный режим). - Вставьте тестовый текст. Совпадения подсвечиваются справа и перечисляются ниже с индексом и группами захвата.
- Отметьте Замена и введите строку замены вроде
$1 или $<name>, чтобы увидеть результат String.replace. - Выберите шаблон в Библиотеке шаблонов, чтобы начать с проверенного regex для email, URL, IP или даты.
Регулярные выражения JavaScript
Тестер использует встроенный движок RegExp вашего браузера, поэтому результаты в точности совпадают с тем, что возвращают String.match, matchAll, replace и RegExp.exec в JavaScript и Node.js. Включая современный синтаксис: именованные группы (?<name>…), ретроспективную проверку (?<=…), Unicode property escapes вроде \p{L} с флагом u и индексы совпадений с флагом d.
Что делают флаги
| Флаг | Имя | Эффект |
g | global | Найти все совпадения, а не остановиться на первом. |
i | ignoreCase | Буквы совпадают независимо от регистра. |
m | multiline | ^ и $ совпадают в начале и конце каждой строки. |
s | dotAll | . совпадает и с переводом строки. |
u | unicode | Шаблон обрабатывается по кодовым точкам; включает \p{…} и \u{…}. |
y | sticky | Совпадение только с текущей позиции lastIndex. |
d | hasIndices | Возвращает начальную и конечную позиции для каждой группы захвата. |
Защита от катастрофического бэктрекинга
Шаблоны с вложенными квантификаторами, например (a+)+$ или (\w|\d)*x, могут работать экспоненциально долго на почти совпадающих строках. На обычной веб-странице это подвешивает вкладку. Здесь каждый поиск выполняется в фоновом Web Worker, который останавливается через одну секунду, и вместо зависшего браузера вы получаете понятное предупреждение. Тот же шаблон в продакшен-коде может быть уязвимостью ReDoS, так что считайте предупреждение багом, который нужно исправить.
Советы по написанию regex
- Привязывайте шаблоны через
^ и $ при проверке целых значений, иначе пройдёт совпадение в любом месте строки.
- Предпочитайте конкретные классы вроде
[^"]* вместо .*: они быстрее и не захватывают лишнего.
- Используйте незахватывающие группы
(?:…), когда захваченное значение не нужно.
- Давайте группам имена.
match.groups.year читается проще, чем match[1].
Часто задаваемые вопросы
Какой диалект regex используется?
JavaScript (ECMAScript) через встроенный в браузер RegExp. Большая часть синтаксиса общая с PCRE, Python и Java, но сверхжадные квантификаторы, атомарные группы и встроенные модификаторы вроде (?i) в JavaScript недоступны.
Почему мой шаблон находит только одно совпадение?
Без флага g (global) JavaScript останавливается после первого совпадения. Включите g, чтобы найти все вхождения.
Как ссылаться на группы в строке замены?
Используйте $1, $2… для нумерованных групп, $<name> для именованных, $& для всего совпадения и $$ для символа доллара.
Почему тестер остановился по таймауту?
Шаблон обрабатывал ваш ввод дольше секунды, что почти всегда означает катастрофический бэктрекинг. Ищите вложенные квантификаторы вроде (x+)+ или пересекающиеся альтернативы вроде (a|a)* и перепишите их так, чтобы каждый символ мог совпасть только одним способом.
Отправляются ли мои тестовые данные куда-либо?
Нет. Поиск выполняется локально в Web Worker внутри браузера. Шаблон и текст сохраняются только в вашем браузере, чтобы они остались на месте, когда вы вернётесь.