Тестер регулярных выражений с разбором по-русски
Впишите шаблон и текст — инструмент подсветит совпадения, соберёт таблицу с позициями и группами и покажет, во что превратится текст после замены.
Текст
Совпадения подсвечены двумя оттенками по очереди, чтобы соседние не слипались. Пустое совпадение показано вертикальной чертой. Потолок текста — 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} | Ровно три цифры | 495 |
| [а-яё]+ | Одна и больше русских букв | привет |
| ^\s*$ | Пустая строка | пробелы |
| (\d+)-(\d+) | Две группы через дефис | 12-34 |
| .*? | Ленивый повтор | Кратчайшее совпадение |
Клини, grep и перловый синтаксис
Математическую основу заложил Стивен Клини в 1951 году: он описал регулярные события — множества строк, которые распознаёт конечный автомат, — и ввёл операцию замыкания, ту самую звёздочку, что носит его имя.
В инструменты это пришло через Кена Томпсона. В конце шестидесятых он встроил поиск по шаблону в текстовый редактор для Unix, а в 1974 году появилась отдельная программа grep. Название родилось из команды редактора: g/re/p — глобально найти регулярное выражение и напечатать.
Дальше пути разошлись. Стандарт POSIX закрепил один синтаксис, а язык Perl развил свой, куда более богатый: именованные группы, просмотр вперёд и назад, ленивые квантификаторы. В 1997 году Филип Хэзел выпустил библиотеку PCRE с перловым синтаксисом, и она разошлась по большинству языков, включая JavaScript. Отдельная опасность — катастрофический перебор с возвратом: неудачно составленный шаблон на длинной строке может считаться минутами и подвесить сервер, и такие случаи давно описаны как отдельный класс уязвимостей.


Как отлаживать шаблон по шагам
Вставьте шаблон и текст, посмотрите на подсветку. Начинайте с самой простой версии и усложняйте по шагу, проверяя после каждого: длинное выражение, написанное сразу целиком, почти никогда не работает с первого раза, и найти в нём ошибку тяжело.
Помните про жадность. Запись .* захватывает максимально длинный кусок, поэтому шаблон для содержимого тега легко проглатывает половину документа. Ленивая версия .*? берёт кратчайшее совпадение и обычно и есть то, что нужно.
Разбирать HTML регулярными выражениями не стоит: вложенность им не по зубам, и любой нестандартный тег ломает разбор. Для этого есть парсеры. А вот проверить формат строки или вытащить из лога числа — ровно их задача. Готовые шаблоны для частых случаев собраны в проверке почтовых адресов.
Комментируйте сложные шаблоны. Многие движки поддерживают расширенный режим, в котором внутри выражения разрешены пробелы и пояснения после решётки. Шаблон на две строки с подписями к группам через полгода понятен, а без них — нет.
Проверяйте шаблон на граничных случаях. Пустая строка, строка из одних пробелов, слишком длинное значение и текст с переносами строк ломают выражения чаще всего. Особенно это касается точки: по умолчанию она не совпадает с переносом, и многострочный текст обрабатывается не так, как ожидается.
| Основа теории | Стивен Клини, 1951 |
| Звёздочка Клини | повтор ноль и более |
| Программа grep | 1974 |
| Расшифровка grep | g/re/p |
| Стандарт POSIX | базовый синтаксис |
| Библиотека PCRE | 1997 |
| Жадный повтор | .* |
| Ленивый повтор | .*? |
Как пользоваться
Главное здесь справа: свой токенизатор идёт по выражению и переводит каждый кусок на русский, так что \d{2,4} читается как «цифра от 0 до 9, от 2 до 4 раз подряд», а (?=…) — как «дальше должно идти, но в совпадение не войдёт». Ниже идут подсказки, почему шаблон молчит: забытый флаг g, жадная точка, точка без флага s на многострочном тексте, \w на кириллице. Восемь пресетов под российские реалии — телефон в пяти написаниях, ИНН, СНИЛС, ФИО, дата, автономер, почта, адрес — берутся одной кнопкой. Движок здесь браузерный JavaScript, и готовый код можно скопировать под JS, PHP и Python.
- Поле ждёт само выражение: \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 смысла в нём немного, и подсказка про это скажет.
Спросите нейросети об инструменте
Больше возможностей: Нейросеть для кода, написать, найти ошибку, объяснить.
Похожие инструменты
Синтаксис, дубли, опечатки в доменах вроде gmail.ru, одноразовые почты, ролевые адреса и кириллица в латинском написании.
ОткрытьJWT-декодерРазбор токена JWT: заголовок, полезная нагрузка с расшифровкой стандартных полей, сроки выдачи и истечения в датах, проверка структуры. Без отправки на сервер.
ОткрытьChmod калькуляторПрава доступа Linux в трёх видах: галочки, число 755 и строка rwxr-xr-x. Специальные биты и готовая команда.
ОткрытьГенератор UUIDВерсии 4 и 7 пачками, пять форматов записи и разбор готового идентификатора с датой создания для v7.
ОткрытьСравнить два JSONПоказывает, чем отличаются два ответа API: какие поля появились, пропали и изменились, с путём вида data.items[0].price. Служебные поля можно исключить.
ОткрытьШифр ВиженераШифрование и расшифровка по ключевому слову, а также шифр Цезаря со сдвигом и Атбаш, русский и латинский алфавиты, таблица Виженера.
ОткрытьЕщё инструменты для кода и данных
Base64 и URL, форматтер и сравнение JSON, хеши, регулярные выражения, cron, подсети, UUID, QR-код и Unix-время — в разделе 42 инструмента.