Тестер регулярных выражений
Проверяйте регулярные выражения JavaScript на образце текста с подсветкой совпадений в реальном времени, группами захвата, именованными группами и предпросмотром замены. Работает полностью в браузере.
- Файлы никогда не покидают ваше устройство
- Бесплатно, без регистрации
- Без водяных знаков
- Работает офлайн после загрузки
Как пользоваться: тестер регулярных выражений
- 1
Введите шаблон
Наберите выражение и выберите нужные флаги.
- 2
Добавьте тестовый текст
Совпадения подсвечиваются по мере ввода, а все группы захвата перечисляются рядом.
- 3
Попробуйте замену
Вкладка замены показывает предпросмотр результата с использованием ссылок вида $1.
Почему подсветка в реальном времени лучше, чем чтение шаблона в уме
Регулярное выражение по-настоящему трудно мысленно проследить на реальном тексте — шаблон вроде `(\d{3})-(\d{2})-(\d{4})` достаточно понятен как абстрактное описание, но убедиться, что он совпадает именно с нужными подстроками и только с ними, применительно к конкретному блоку тестового текста, — это совсем другая проверка, чем чтение шаблона и рассуждение о нём. Подсветка каждого совпадения прямо на тестовом тексте по мере набора шаблона превращает это абстрактное рассуждение в конкретное, немедленное визуальное подтверждение — совпадения либо появляются там, где ожидалось, либо нет, без всякой мысленной симуляции.
Это особенно ценно для всего, что использует lookahead, lookbehind или нежадные квантификаторы, где реальные границы совпадения часто оказываются не такими, какими их представил бы человек, просто прочитав шаблон. Увидеть точно, где совпадение начинается и заканчивается, вместо того чтобы предполагать, — значит поймать ошибку на единицу сразу же, а не после того, как она уже попала в функцию валидации в продакшене.
Регулярные выражения JavaScript — не тот же язык, что PCRE или Python re
Синтаксис регулярных выражений выглядит в целом похоже в разных языках, но конкретный набор поддерживаемых возможностей отличается — и это начинает иметь значение, как только шаблон использует что-то за пределами базовых конструкций. В JavaScript нет притяжательных квантификаторов и атомарных групп — обе эти возможности есть в PCRE (используемом в PHP и многих других инструментах) как способ явно предотвратить определённые виды бэктрекинга. Проверки lookbehind, теперь поддерживаемые в JavaScript, появились значительно позже, чем lookahead, и были недоступны в старых версиях браузеров, что всё ещё иногда важно для кода, который должен работать в устаревших окружениях. А `\d` в шаблоне JavaScript соответствует только ASCII-цифрам 0–9, если только шаблон дополнительно не несёт флаг `u` (Unicode), что удивляет всех, кто предполагает, что он ведёт себя так же, как Unicode-совместимый класс цифр в regex-движке другого языка. Этот инструмент построен именно вокруг проверки шаблона, предназначенного специально для JavaScript, а не скопированного примера, написанного для Python или инструмента командной строки.
Катастрофический бэктрекинг и зачем тестеру лимит времени
У некоторых regex-шаблонов — чаще всего с вложенными квантификаторами вроде `(a+)+b` — есть патологическое свойство: на длинной строке, которая в итоге не совпадает, движок перебирает экспоненциально растущее число вариантов бэктрекинга, прежде чем сдаться. Шаблон, мгновенно завершающийся на несовпадающей строке из десяти символов, может работать дольше возраста вселенной на строке из пятидесяти символов — и это не преувеличение, а буквальное математическое поведение экспоненциального роста. Это реальный, эксплуатируемый класс уязвимостей в продакшен-системах — ReDoS, или отказ в обслуживании через регулярное выражение, — когда злоумышленник, способный контролировать входную строку для уязвимого шаблона, может бесконечно подвесить процесс сервера одним-единственным запросом.
Этот инструмент прерывает вычисление после короткого лимита времени именно для того, чтобы шаблон с таким свойством замораживал только тестовую сессию, а не всю вкладку браузера, и само срабатывание этого прерывания уже полезная информация: оно означает, что шаблон, вероятно, обладает именно такой уязвимостью и нуждается в перестройке — как правило, за счёт того, что внутренний квантификатор делается более конкретным, чтобы неоднозначность, вызывающая экспоненциальный бэктрекинг, вообще не могла возникнуть.
Часто задаваемые вопросы
Какой это диалект регулярных выражений?
JavaScript (ECMAScript) — то, что работает в вашем браузере. Он местами отличается от PCRE и Python: нет lookbehind в очень старых браузерах, нет притяжательных квантификаторов и атомарных групп, а `\d` соответствует только ASCII-цифрам, если не указан флаг `u`.
Что на самом деле меняет глобальный флаг?
Без `g` находится только первое совпадение. С ним возвращаются все совпадения — это то, что нужно для подсветки или замены по всему документу. Этот инструмент в любом случае показывает все совпадения, но флаг всё равно влияет на поведение `replace`.
Почему мой шаблон завершился по таймауту?
Некоторые шаблоны катастрофически бэктрекают — вложенные квантификаторы вроде `(a+)+b` могут работать экспоненциально долго на несовпадающей строке. Инструмент прерывает выполнение после короткого лимита времени вместо того, чтобы заморозить вкладку браузера. Если это происходит, исправление почти всегда заключается в том, чтобы сделать внутренний квантификатор более конкретным.
Как использовать группы захвата в замене?
Ссылайтесь на них как `$1`, `$2` и так далее, либо `$<имя>` для именованных групп, записанных как `(?<имя>…)`. Используйте `$&` для всего совпадения и `$$` для буквального знака доллара.
Вам также может понадобиться
Форматтер JSON
Мгновенное форматирование, валидация и минификация JSON
Кодировщик и декодировщик URL
Percent-кодирование и декодирование URL и строк запроса
Удаление повторяющихся строк
Удаляйте дубликаты, сортируйте и приводите списки в порядок
Кодировщик и декодировщик Base64
Кодирование и декодирование Base64 и Base64URL
Форматировщик CSS
Форматирование и минификация таблиц стилей
Минификатор CSS
Сжимайте таблицы стилей настоящим минификатором, понимающим CSS
Генератор хешей
MD5, SHA-1, SHA-256, SHA-384 и SHA-512
Форматировщик HTML
Аккуратное форматирование и расстановка отступов в HTML