Тестер регулярных выражений
Проверяйте регулярное выражение вживую: совпадения и группы захвата, предпросмотр замен и разбиение текста — с семантикой JavaScript.
Введите шаблон и текст, чтобы увидеть результаты
Что делает этот инструмент
Регулярное выражение — это компактный язык описания текстовых шаблонов, и единственный надёжный способ написать его — смотреть, как оно работает на настоящем тексте. Этот тестер делает именно это, вживую, в трёх режимах. Поиск показывает каждое место, где шаблон совпадает, с подсветкой в тексте и списком групп захвата под ним. Замена показывает, что выдаст String.replace, включая ссылки $1 и lt;name>. Разбиение показывает, как String.split разрежет текст — включая то, что почти никто не предсказывает правильно: захваченные разделители, попадающие в результат.
Шаблон выполняется на движке JavaScript вашего собственного браузера, а не на его имитации. То, что совпадает здесь, совпадёт в вашем коде JavaScript байт в байт — потому что работу делает тот же самый движок.
Как читать результаты поиска
Каждое совпадение подсвечивается в тестовом тексте и выводится под ним со своей позицией — смещениями символов, где оно начинается и заканчивается. Если в шаблоне есть группы захвата, каждая группа показана под своим совпадением с захваченным значением. Группы нумеруются по открывающей скобке, слева направо, ровно так, как их нумерует движок для $1, $2 и обратных ссылок; именованная группа показывает имя рядом с номером. Группа, не участвовавшая в совпадении — например, проигравшая сторона альтернативы — помечается как таковая, а не показывается пустой строкой: для вашего кода это разные вещи, undefined против "".
Шаблон может законно совпасть с нулём символов — на это способны ^, \b или пустая альтернатива. Такие совпадения нулевой длины ничего не подсвечивают, поэтому инструмент отмечает позицию тонкой чертой, а не оставляет вас гадать, куда делось совпадение.
Флаги
Флаги меняют поведение всего шаблона, и два из них — источник большей части путаницы с регулярными выражениями:
- g (глобальный) — найти все совпадения, а не только первое. Без него поиск показывает один результат, а замена меняет одно вхождение. Это флаг, о котором забывают чаще всего.
- i (без учёта регистра) — буквы совпадают независимо от регистра.
- m (многострочный) — ^ и $ совпадают в начале и конце каждой строки, а не только всего текста.
- s (dotAll) — точка совпадает и с переводами строки. Без него . останавливается на каждом переносе.
- u (Unicode) — шаблон работает в кодовых точках: эмодзи и другие символы вне базового диапазона ведут себя корректно, а экранирования свойств \p{…} становятся доступны.
- y (липкий) — совпадение должно начинаться ровно там, где закончилось предыдущее. Полезно для токенизаторов; неожиданно везде ещё.
- d (индексы) — движок записывает точные позиции каждой группы. На то, что совпадает, это не влияет.
Ссылки в тексте замены
Текст замены не берётся буквально — горстка последовательностей с $ раскрывается для каждого совпадения. $1–$9 вставляют то, что захватили нумерованные группы, lt;name> вставляет именованную группу, amp; — всё совпадение, а $ даёт буквальный знак доллара. Всё остальное копируется как есть.
"2026-07-20".replace(/(?<y>\d{4})-(\d{2})-(\d{2})/, "$3.$2.lt;y>")
// → "20.07.2026"Поведение JavaScript, которое стоит усвоить: без флага g replace меняет только первое вхождение. Это не причуда инструмента — так поступит ваш код. Когда g выключен, инструмент показывает подсказку, чтобы единственная замена не выглядела ошибкой.
Как на самом деле ведёт себя split
У String.split с регулярным выражением есть два поведения, которые регулярно удивляют даже опытных разработчиков, и режим разбиения существует во многом ради того, чтобы сделать их видимыми. Во-первых, если в шаблоне есть группы захвата, захваченное вплетается в итоговый массив между кусками — разбиение "a,b" по (,) даёт три части: a, запятую, b. Во-вторых, совпадения в самом начале или конце текста, или два соседних совпадения, дают в результате пустые строки — инструмент показывает их явно, а не прячет.
"a,b".split(/(,)/) // → ["a", ",", "b"] ",a,".split(/,/) // → ["", "a", ""]
Сбежавшие шаблоны останавливают, а не терпят
Некоторые шаблоны — ловушки. Вложенный квантификатор вроде (a+)+, применённый к длинной строке, которая почти совпадает, заставляет движок перебрать экспоненциально много комбинаций, прежде чем сдаться — это называется катастрофическим возвратом (backtracking), и он может заморозить вкладку браузера на минуты. Этот инструмент выполняет шаблон в отдельном потоке-воркере и останавливает его через две секунды: сбежавший шаблон стоит вам сообщения, а не замороженной страницы. Если вы увидели это сообщение, поищите в шаблоне вложенные квантификаторы или перекрывающиеся альтернативы; исправление обычно в том, чтобы внутреннее и внешнее повторения не могли совпасть с одним и тем же текстом.
Как и в каждом инструменте на этом сайте, шаблон и текст никогда не покидают ваше устройство — воркер является частью страницы, а не сервером.
Частые вопросы
- Какой диалект регулярных выражений использует тестер?
- JavaScript (ECMAScript) — шаблон выполняется на движке самого браузера. Именованные группы, lookbehind и экранирования свойств Unicode \p{…} работают как в современном JavaScript. Шаблоны из PCRE или Python в основном переносятся, но конструкции, которых нет в JavaScript — притяжательные квантификаторы, атомарные группы, \A и \z — будут отклонены или означают другое.
- Почему мой шаблон находит только одно совпадение?
- Почти всегда: флаг g выключен. Без него JavaScript останавливается на первом совпадении, а replace меняет только первое вхождение. Включите флажок g, чтобы искать по всему тексту.
- Что означает «не участвовала» для группы?
- Группа есть в шаблоне, но в этом конкретном совпадении не использовалась — обычно потому, что она в проигравшей ветке альтернативы или под квантификатором, совпавшим ноль раз. В коде её значение — undefined, что отличается от захвата пустой строки, и инструмент сохраняет это различие.
- Отправляется ли мой шаблон или текст на сервер?
- Нет. Сопоставление выполняется целиком в вашем браузере, в потоке-воркере той же страницы. Двухсекундный предохранитель тоже срабатывает локально — ничего из введённого не покидает ваше устройство.