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

Введите регулярное выражение и смотрите подсветку всех совпадений прямо во время ввода — с группами захвата, предпросмотром замены и библиотекой готовых шаблонов.

Работает в браузереБез регистрацииНичего не загружается

Подсветка совпадений

    
Используйте $1, $<name>, $& (всё совпадение)
Подробности совпадений
#ИндексСовпадениеГруппы
Шпаргалка по regex
.Любой символ, кроме перевода строки (любой с s)
\d \w \sЦифра, символ слова, пробельный символ
\D \W \SНе цифра, не символ слова, не пробел
[abc] [^abc]Любой из / ни один из a, b, c
[a-z0-9]Диапазон символов
\p{L} \p{N}Буква / цифра Unicode (нужен u)
^ $Начало / конец ввода (строки с m)
\b \BГраница слова / не граница
* + ?0 или больше, 1 или больше, 0 или 1
{n} {n,} {n,m}Ровно n, не менее n, от n до m
*? +? ??Ленивый (как можно меньше)
a|ba или b
(…)Группа захвата, ссылка $1
(?<name>…)Именованная группа, $<name>
(?:…)Незахватывающая группа
\1 \k<name>Обратная ссылка
(?=…) (?!…)Опережающая / негативная опережающая проверка
(?<=…) (?<!…)Ретроспективная / негативная ретроспективная проверка
\. \* \\Экранированные символы
\n \t \rПеревод строки, табуляция, возврат каретки
\uFFFFКодовая единица Unicode
\u{1F600}Кодовая точка (нужен u)
$&Всё совпадение в замене
$` $'Текст до / после совпадения

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

  1. Введите шаблон между слешами, без обрамляющих /.
  2. Включайте флаги, например g (все совпадения), i (без учёта регистра) и m (многострочный режим).
  3. Вставьте тестовый текст. Совпадения подсвечиваются справа и перечисляются ниже с индексом и группами захвата.
  4. Отметьте Замена и введите строку замены вроде $1 или $<name>, чтобы увидеть результат String.replace.
  5. Выберите шаблон в Библиотеке шаблонов, чтобы начать с проверенного regex для email, URL, IP или даты.

Регулярные выражения JavaScript

Тестер использует встроенный движок RegExp вашего браузера, поэтому результаты в точности совпадают с тем, что возвращают String.match, matchAll, replace и RegExp.exec в JavaScript и Node.js. Включая современный синтаксис: именованные группы (?<name>…), ретроспективную проверку (?<=…), Unicode property escapes вроде \p{L} с флагом u и индексы совпадений с флагом d.

Что делают флаги

ФлагИмяЭффект
gglobalНайти все совпадения, а не остановиться на первом.
iignoreCaseБуквы совпадают независимо от регистра.
mmultiline^ и $ совпадают в начале и конце каждой строки.
sdotAll. совпадает и с переводом строки.
uunicodeШаблон обрабатывается по кодовым точкам; включает \p{…} и \u{…}.
ystickyСовпадение только с текущей позиции lastIndex.
dhasIndicesВозвращает начальную и конечную позиции для каждой группы захвата.

Защита от катастрофического бэктрекинга

Шаблоны с вложенными квантификаторами, например (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 внутри браузера. Шаблон и текст сохраняются только в вашем браузере, чтобы они остались на месте, когда вы вернётесь.

Похожие инструменты