Тестер регулярных выражений с разбором по-русски
Впишите шаблон и текст — инструмент подсветит совпадения, соберёт таблицу с позициями и группами и покажет, во что превратится текст после замены. Главное здесь справа: свой токенизатор идёт по выражению и переводит каждый кусок на русский, так что \d{2,4} читается как «цифра от 0 до 9, от 2 до 4 раз подряд», а (?=…) — как «дальше должно идти, но в совпадение не войдёт». Ниже идут подсказки, почему шаблон молчит: забытый флаг g, жадная точка, точка без флага s на многострочном тексте, \w на кириллице. Восемь пресетов под российские реалии — телефон в пяти написаниях, ИНН, СНИЛС, ФИО, дата, автономер, почта, адрес — берутся одной кнопкой. Движок здесь браузерный JavaScript, и готовый код можно скопировать под JS, PHP и Python.
Текст
Совпадения подсвечены двумя оттенками по очереди, чтобы соседние не слипались. Пустое совпадение показано вертикальной чертой. Потолок текста — 20 000 символов, показываются первые 500 совпадений.
Разбор шаблона по-русски
Отступ показывает вложенность скобок. Номера групп проставлены так же, как их считает движок: слева направо по открывающей скобке.
Шаблон замены
Работают $1…$99, $<имя>, $& для всего совпадения, $` и $' для текста слева и справа, $$ для знака доллара.
| № | Совпадение | Позиция | Длина | Группы по номерам | Группы по именам |
|---|
Код собирается под выбранный режим и текущие флаги. Для Python именованные группы переписываются в (?P<имя>…), ссылки \k<имя> — в (?P=имя), а $1 в замене — в \1. Для PHP берётся разделитель ~ и модификаторы без g.
Проверка идёт браузерным JavaScript
Шаблон уходит в new RegExp вашего браузера, поэтому результат тут — это поведение движка JavaScript. В PHP на PCRE и в модуле re из Python отдельные конструкции работают иначе, и переносить выражение стоит с оглядкой.
\d в JavaScript — всегда ровно [0-9]. В Python \d по умолчанию ловит и арабо-индийские цифры, и цифры других письменностей, пока не поставлен флаг re.ASCII. В PCRE \d расширяется до юникодных цифр с модификатором u вместе с UCP.
\w в JavaScript — латинская буква, цифра и подчёркивание, кириллица сюда не входит никогда. В Python \w берёт буквы любого алфавита, включая русские. В PCRE поведение зависит от модификаторов.
Именованные группы пишутся по-разному: (?<имя>…) в JavaScript и PCRE, (?P<имя>…) в Python. Ссылка на такую группу внутри шаблона — \k<имя> против (?P=имя), а в строке замены — $<имя> против \g<имя>. В preg_replace именованной подстановки нет вовсе, там ставят номер: ${1}.
Ретроспективная проверка (?<=…) в JavaScript принимает выражение любой длины. Python и PCRE требуют фиксированную длину и ругаются на (?<=a+).
Сверхжадные квантификаторы a++ и атомарные группы (?>…) живут в PCRE. В JavaScript и в re из Python такой записи нет: первая даст ошибку разбора, вторая — тоже.
Флаги u и y есть только в JavaScript. В PHP модификатор u означает работу с UTF-8, в Python строки и так юникодные. Знак $ в Python совпадает и перед последним переводом строки, в JavaScript без флага m — только в самом конце.
Как пользоваться
- Поле ждёт само выражение: \d{3}-\d{2}. Обрамление /…/ и флаги живут отдельно, флаги ставятся галочками справа. Потолок шаблона — 400 символов.
- Флаг g включает поиск всех вхождений, i снимает разницу регистра, m переносит ^ и $ на каждую строку, s разрешает точке ловить перевод строки, u включает Юникод и \p{…}, y ищет только вплотную к прошлому совпадению.
- Каждая строка разбора — один кусок шаблона и его смысл по-русски, с отступом по вложенности скобок. Ниже подсказки: они смотрят на связку шаблона, флагов и текста и объясняют типовые промахи.
- В режиме замены работают $1, $2 и $<имя>, результат виден целиком. Кнопка внизу отдаёт готовый код под JavaScript, PHP и Python с поправкой на синтаксис именованных групп.
Частые вопросы
Какой движок регулярных выражений тут работает?
Браузерный JavaScript: шаблон уходит в new RegExp прямо на вашей странице, никакой сети и никакого сервера. Отсюда и особенности: \d — это ровно [0-9], \w — только латиница с цифрой и подчёркиванием, есть флаги u и y, которых в других языках нет. В PHP и Python часть конструкций ведёт себя иначе, про это на странице есть отдельный блок и поправки в генераторе кода.
Почему шаблон находит только первое совпадение?
Скорее всего не стоит флаг g. Без него движок делает один проход и останавливается на первой удаче: так работают и match в JavaScript, и preg_match в PHP, и re.search в Python. Флаг g включается галочкой, подсказка про него появляется сама, пока галочка снята.
Что за подсказки под таблицей?
Разбор смотрит не только на шаблон, но и на флаги с текстом. Он скажет, что точка не ловит перевод строки без флага s, что \p{L} без флага u читается движком как буквы p и скобки, что \w проходит мимо кириллицы, что диапазон [а-я] не включает ё, что жадная .* тянет до конца строки и что ^ с $ без флага m относятся ко всему тексту целиком.
Зачем ограничены длина текста и длина шаблона?
Из-за катастрофического возврата. Шаблон вроде (a+)+b на строке из тридцати букв «a» перебирает миллиарды вариантов и подвешивает вкладку намертво: остановить уже запущенный exec изнутри JavaScript нечем. Поэтому текст ограничен 20 000 символами, шаблон — 400, число совпадений — 500, а на каждой итерации поиска меряется Date.now. Шаблон с вложенными квантификаторами вдобавок проходит лесенку проб: сначала первые 8 символов текста, потом 16, 24 и дальше по нарастающей. Как только ступень занимает больше 4 миллисекунд, поиск останавливается и вместо результата появляется предупреждение; текста длиннее 2000 символов такой шаблон не получает вовсе.
Как работает режим замены?
Совпадения ищутся тем же проходом, а шаблон замены раскрывается своим кодом: $1…$99 подставляют группы по номеру, $<имя> — по имени, $& — всё совпадение, $` и $' — текст слева и справа, $$ даёт знак доллара. Пустая группа подставляет пустоту. Результат виден целиком, рядом счётчик замен.
Пресеты можно брать в прод как есть?
Их стоит читать как заготовку под свои данные. Телефон покрывает пять типовых написаний, но не ловит запись с добавочным номером; ИНН проверяет только длину в 10 и 12 знаков без контрольной суммы; автономер написан кириллическими буквами, а в выгрузках часто лежит латинская X вместо Х; адрес обрывается на первом пробеле и может прихватить точку в конце предложения. Разбор справа показывает, что именно делает каждый кусок, и подогнать шаблон под свой случай проще.
Чего инструмент не делает?
Он не рисует схему конечного автомата, не показывает шаги перебора и не подбирает выражение по примерам текста. Проверка идёт одним движком — браузерным; поведение PCRE и модуля re из Python здесь не эмулируется, генератор кода лишь переписывает то, что переписывается однозначно. Флаг y работает, но в отрыве от lastIndex смысла в нём немного, и подсказка про это скажет.
Похожие инструменты
Ссылка, текст, телефон или Wi-Fi → QR-код с настройкой размера и коррекции. Скачать PNG. Кодирование в браузере, без отправки на сервер.
ОткрытьУзнать мой IPВаш IP, провайдер и локация + что о вас видят сайты: браузер, ОС, устройство, экран, шрифты, WebGL-видеокарта и цифровой отпечаток.
ОткрытьBase64 encode / decodeПереводит текст в Base64 и обратно с корректной кириллицей (UTF-8). Построчный режим для списков значений.
ОткрытьГенератор фавиконаИз картинки — все нужные размеры иконки, favicon.ico и готовый код для head. Показывает, как иконка выглядит во вкладке.
ОткрытьURL энкодер / декодерКодирует ссылки и текст в percent-encoding и обратно. Построчно для списка URL, режим компонента или целой ссылки.
ОткрытьКонвертер цветов и контрастHEX, RGB и HSL в одном окне, шкала оттенков одного тона и проверка контраста по WCAG с ответом, годится ли цвет для текста.
ОткрытьЕщё инструменты для SEO и маркетинга
Кластеризатор запросов, генераторы sitemap и robots.txt, минус-слова, разметка Schema.org и калькуляторы — в разделе инструментов.