Главная›Инструменты›Разработка и данные›Кодирование и данные›Тестер регулярных выражений с разбором по-русски

Тестер регулярных выражений с разбором по-русски

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

/ / g
Впишите шаблон — поиск пойдёт сам.

Текст

пусто

Совпадения подсвечены двумя оттенками по очереди, чтобы соседние не слипались. Пустое совпадение показано вертикальной чертой. Потолок текста — 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 — только в самом конце.

Как шаблон описывает множество строк

Тестер регулярных выражений подсвечивает совпадения прямо в тексте и объясняет шаблон по частям на русском языке. Каждый элемент разбирается отдельно: якорь начала строки, класс символов, квантификатор, группа. Так становится видно, какая часть шаблона отвечает за какой кусок совпадения.

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

Отдельно инструмент показывает захваченные группы. Регулярное выражение умеет не только находить, но и разбирать: из строки с датой можно вытащить день, месяц и год отдельными кусками и переставить их в другом порядке при замене.

Шаблон и оттиск
Шаблон описывает целое семейство подходящих предметов сразу. Фото: Ashley Dace, CC BY-SA 2.0.
ЗаписьЧто означаетПример совпадения
\d{3}Ровно три цифры495
[а-яё]+Одна и больше русских буквпривет
^\s*$Пустая строкапробелы
(\d+)-(\d+)Две группы через дефис12-34
.*?Ленивый повторКратчайшее совпадение

Клини, grep и перловый синтаксис

Математическую основу заложил Стивен Клини в 1951 году: он описал регулярные события — множества строк, которые распознаёт конечный автомат, — и ввёл операцию замыкания, ту самую звёздочку, что носит его имя.

В инструменты это пришло через Кена Томпсона. В конце шестидесятых он встроил поиск по шаблону в текстовый редактор для Unix, а в 1974 году появилась отдельная программа grep. Название родилось из команды редактора: g/re/p — глобально найти регулярное выражение и напечатать.

Дальше пути разошлись. Стандарт POSIX закрепил один синтаксис, а язык Perl развил свой, куда более богатый: именованные группы, просмотр вперёд и назад, ленивые квантификаторы. В 1997 году Филип Хэзел выпустил библиотеку PCRE с перловым синтаксисом, и она разошлась по большинству языков, включая JavaScript. Отдельная опасность — катастрофический перебор с возвратом: неудачно составленный шаблон на длинной строке может считаться минутами и подвесить сервер, и такие случаи давно описаны как отдельный класс уязвимостей.

Телетайп
Регулярные выражения родились в мире, где текст правили построчно на телетайпе. Фото: Rcc8j, CC BY-SA 4.0.
Ранняя вычислительная машина
Unix и grep появились на машинах с крохотной по нынешним меркам памятью. Фото: Marcin Wichary, CC BY 2.0.

Как отлаживать шаблон по шагам

Вставьте шаблон и текст, посмотрите на подсветку. Начинайте с самой простой версии и усложняйте по шагу, проверяя после каждого: длинное выражение, написанное сразу целиком, почти никогда не работает с первого раза, и найти в нём ошибку тяжело.

Помните про жадность. Запись .* захватывает максимально длинный кусок, поэтому шаблон для содержимого тега легко проглатывает половину документа. Ленивая версия .*? берёт кратчайшее совпадение и обычно и есть то, что нужно.

Разбирать HTML регулярными выражениями не стоит: вложенность им не по зубам, и любой нестандартный тег ломает разбор. Для этого есть парсеры. А вот проверить формат строки или вытащить из лога числа — ровно их задача. Готовые шаблоны для частых случаев собраны в проверке почтовых адресов.

Комментируйте сложные шаблоны. Многие движки поддерживают расширенный режим, в котором внутри выражения разрешены пробелы и пояснения после решётки. Шаблон на две строки с подписями к группам через полгода понятен, а без них — нет.

Проверяйте шаблон на граничных случаях. Пустая строка, строка из одних пробелов, слишком длинное значение и текст с переносами строк ломают выражения чаще всего. Особенно это касается точки: по умолчанию она не совпадает с переносом, и многострочный текст обрабатывается не так, как ожидается.

Основа теорииСтивен Клини, 1951
Звёздочка Клиниповтор ноль и более
Программа grep1974
Расшифровка grepg/re/p
Стандарт POSIXбазовый синтаксис
Библиотека PCRE1997
Жадный повтор.*
Ленивый повтор.*?

Как пользоваться

Главное здесь справа: свой токенизатор идёт по выражению и переводит каждый кусок на русский, так что \d{2,4} читается как «цифра от 0 до 9, от 2 до 4 раз подряд», а (?=…) — как «дальше должно идти, но в совпадение не войдёт». Ниже идут подсказки, почему шаблон молчит: забытый флаг g, жадная точка, точка без флага s на многострочном тексте, \w на кириллице. Восемь пресетов под российские реалии — телефон в пяти написаниях, ИНН, СНИЛС, ФИО, дата, автономер, почта, адрес — берутся одной кнопкой. Движок здесь браузерный JavaScript, и готовый код можно скопировать под JS, PHP и Python.

  1. Поле ждёт само выражение: \d{3}-\d{2}. Обрамление /…/ и флаги живут отдельно, флаги ставятся галочками справа. Потолок шаблона — 400 символов.
  2. Флаг g включает поиск всех вхождений, i снимает разницу регистра, m переносит ^ и $ на каждую строку, s разрешает точке ловить перевод строки, u включает Юникод и \p{…}, y ищет только вплотную к прошлому совпадению.
  3. Каждая строка разбора — один кусок шаблона и его смысл по-русски, с отступом по вложенности скобок. Ниже подсказки: они смотрят на связку шаблона, флагов и текста и объясняют типовые промахи.
  4. В режиме замены работают $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 смысла в нём немного, и подсказка про это скажет.

Спросите нейросети об инструменте

Отвечает DeepSeek по данным этой страницы и тому, что у вас сейчас на экране: что делает, как устроен, ограничения

Больше возможностей: Нейросеть для кода, написать, найти ошибку, объяснить.

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

Проверка email списком

Синтаксис, дубли, опечатки в доменах вроде 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 инструмента.