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

Работает офлайнНичего не загружаетсяБесплатно, без регистрации

Проверяйте регулярное выражение на своём тексте с живой подсветкой, нумерованными и именованными группами и предпросмотром замены — движком самого JavaScript и с рубильником для катастрофически откатывающихся паттернов: страница никогда не зависает.

Шпаргалка по языку паттернов

КусокЗначитЗаметка
\d \w \sцифра, символ слова, пробелзаглавные отрицают: \D — не-цифра
+ * ?один и более, ноль и более, необязательнодобавьте ? для ленивой версии
{2,5}от двух до пяти повторов{2,} — два и более
[abc] [^abc]любой из, ни один издиапазоны вроде [a-z0-9]
(x) (?:x) (?<n>x)захват, группа без захвата, именованный захватесли значение не нужно — (?:)
^ $ \bначало, конец, граница словас m — построчно
(?=x) (?!x)за которым следует, не следуетнулевой ширины — ничего не поглощают

Две привычки, предотвращающие большинство regex-багов

Якорите то, что имеете в виду. Незаякоренный паттерн совпадает где угодно внутри текста: \d{4} охотно находит четыре цифры внутри шестнадцатизначного номера карты. Валидационным паттернам почти всегда нужны ^…$ вокруг. Экранируйте то, что вставляете. Четырнадцать символов — операторы; точка в домене и плюс в телефонном номере молча меняют смысл паттерна, если не записаны как \. и \+.

Сопоставление выполняется локально в worker-потоке; ни паттерн, ни текст не покидают браузер.

Частые вопросы

Какой это диалект регулярных выражений?

В точности JavaScript — инструмент прогоняет паттерн через движок самого браузера, так что совпадающее здесь совпадёт в вашем коде, скриптах Node и в DevTools. Большая часть синтаксиса общая с PCRE, но поддержка lookbehind, классы \p{…} (с флагом u) и именованные группы следуют именно стандарту ECMAScript.

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

g находит все совпадения, а не первое; i игнорирует регистр; m заставляет ^ и $ срабатывать на каждом переводе строки, а не только на краях текста; s разрешает точке пересекать переводы строк; u включает режим кодовых точек — один эмодзи становится одним символом и работают классы \p{Letter}. Комбинация флагов — часть смысла паттерна: одно и то же выражение с m и без может совпадать с совершенно разным.

Почему инструмент остановил мой паттерн через две секунды?

Катастрофический откат: паттерн вроде (a+)+$ на длинной цепочке a с одной b в конце заставляет движок перепробовать экспоненциально много способов разбить эти a, прежде чем признать неудачу. Инструмент выполняет сопоставление в отдельном потоке и убивает его через две секунды — в продакшен-коде тот же паттерн просто завис бы; это настоящий класс отказа в обслуживании (ReDoS). Лечение — перестроить паттерн так, чтобы альтернативы не могли заново делить один и тот же текст: вложенные квантификаторы вроде (a+)+ заменить одним a+, а перекрывающиеся уайлдкарды — явными классами символов.

Что такое пустое совпадение и почему оно на каждой позиции?

Паттерн, способный совпасть с нулём символов — a*, \b, (?=x) — успешен, ничего не поглощая, поэтому с флагом g он успешен по разу на каждой применимой позиции. Инструмент помечает их тонкой кареткой. Это законно (так работают lookahead и якоря), но обычно знак, что квантификатор должен быть +, а не *.

Как использовать захваченные группы в замене?

Поле замены говорит на синтаксисе String.replace: $1–$9 для нумерованных групп, $<имя> для именованных, $& для всего совпадения, $$ для буквального доллара. Не участвовавшая группа подставляется пустой строкой — в столбце групп она видна как прочерк.

Загружается ли куда-то мой текст или паттерн?

Нет — сопоставление выполняется целиком в браузере, в worker-потоке на вашей машине. Строки логов, конфиги и прочие тексты, на которых проверяют паттерны, — ровно те данные, которым не следует путешествовать; здесь они и не путешествуют.

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