Онлайн-тестер, отладчик и разъяснитель регулярных выражений
Создавайте, тестируйте и отлаживайте регулярные выражения с настоящим синтаксическим деревом, позициями каждой группы захвата, предупреждениями о катастрофическом бэктрекинге и экспортом кода на десять языков — всё внутри вкладки.
- Внутри [ ] точка и так буквальная, экранировать её незачем.
Нажмите на подсветку, чтобы выбрать это совпадение. Удерживайте Alt, чтобы увидеть текст без подсветки; F3 и Shift+F3 переходят между совпадениями.
Совпадений нет
Шаблон корректен, он просто не встречается в этом тексте. Проверьте флаги: без g сообщается только о первом совпадении.
[\w.%+-]+Повторяется один или больше раз — жадный: берёт сколько может и отдаёт назад только по необходимости[\w.%+-]Любой один символ из: \w . % + -
@Символ «@»[\w.-]+Повторяется один или больше раз — жадный: берёт сколько может и отдаёт назад только по необходимости[\w.-]Любой один символ из: \w . -
\.Символ «.», взятый буквально[A-Za-z]{2,}Повторяется не меньше 2 раз — жадный: берёт сколько может и отдаёт назад только по необходимости[A-Za-z]Любой один символ из: A–Z a–z
Как это работает
Напишите шаблон
Наберите его, возьмите из библиотеки или вставьте присланную ссылку. Шаблон подсвечивается по тому, чем каждый кусок является на самом деле, а ошибки подчёркиваются ровно там, где они есть.
Выставьте флаги и режим
Включайте g, i, m, s, u, v, y и d, а затем выберите: искать, заменять или разбивать. Выключите режим «вживую», если хотите, чтобы ничего не выполнялось до нажатия кнопки.
Запустите безопасно
Поиск идёт в Web Worker с лимитом в две секунды. Каждое совпадение возвращается с позициями и группами захвата, а панель предупреждает заранее о шаблоне, который может не закончиться никогда.
Заберите с собой
Скопируйте регулярку, выгрузите совпадения в JSON или CSV, сгенерируйте эквивалентный код для десяти языков или отправьте результат прямо в другой инструмент oLoveTools.
Парсер, а не токенизатор
Шаблон разбирается в настоящее синтаксическое дерево, поэтому объяснение показывает, что внутри чего — и не ошибается на именованных группах. Токенизатор читает (?<year>\d{4}) как группу захвата, за которой идёт необязательное нечто; парсер читает именованную группу, которой это и является.
Движок работает там, где его можно убить
Поиск идёт в Web Worker под присмотром сторожевого таймера. Замерено здесь: (a+)+$ против 31 символа занимает больше четырёх минут чистого процессорного времени на том же движке, что и в вашем браузере. На странице это мёртвая вкладка; в воркере — запуск, который прерывают через две секунды.
Совпадения с настоящими позициями
Флаг d включается за кулисами, поэтому каждая группа захвата несёт своё начало и конец, а не только то, что поймала. Именно это позволяет рисовать группы внутри подсвеченного совпадения и прыгать из списка к нужным символам.
Предупреждает до того, как обожжётесь
Вложенные квантификаторы над пересекающимися символами, квантификаторы вокруг того, что может ничего не потребить, обратные ссылки на несуществующие группы, \p{…} без флага u и ретроспективная проверка на слишком старом браузере — всё это отмечается до любого запуска.
Экспорт на десять языков
JavaScript, TypeScript, Python, Java, C#, PHP, Go, Rust, Ruby и grep/sed, с правильно переведёнными флагами и заменой, переписанной в синтаксис каждого языка. Фрагменты для Go и Rust честно сообщают, когда шаблон использует то, чего RE2 не умеет.
Связан с остальным набором
Отправьте заменённый текст, части после разбиения или совпадения в JSON прямо в WordFlow, DiffSnap, JSONFlow, CodeCard или HashBolt — без похода в папку загрузок.
Тестер регулярок, который не может подвесить браузер
Регулярные выражения — единственное, что тестер обязан выполнять до того, как они станут правильными, а неправильное может оказаться патологическим: шаблон вроде (a+)+$ против строки, которая почти подходит, занимает экспоненциальное время, и движок браузера нельзя прервать. RegexFlow выполняет каждый поиск внутри Web Worker со сторожевым таймером на две секунды. Если запуск затягивается, воркер завершается и заменяется новым, и вы получаете сообщение вместо замороженной вкладки со своим шаблоном внутри.
Ничего не покидает вкладку
Шаблон, тестовый текст, строка замены и любой открытый файл обрабатываются целиком в вашем браузере — без загрузки на сервер и без обращений к нему. Файлы читаются собственным FileReader браузера. Единственное, что может уйти наружу, — ссылка для обмена, и только когда вы нажмёте кнопку, которая её собирает.
От рабочего шаблона к рабочему коду
Разбор логов, который должен пережить кривую строку, валидация, которая должна отклонять не хуже, чем принимать, поиск с заменой по всему репозиторию, где $1 обязан попасть в нужное место, и тот момент, когда вам достаётся чужой шаблон в сорок символов и надо понять, что он делает, прежде чем его трогать. Дерево объяснений, позиции и таблица групп — именно для этого момента.
Поиск использует собственный RegExp вашего браузера, поэтому то, что вы видите, — ровно то, что сделает ваш JavaScript, включая места, где поведение расходится: именно поэтому инструмент проверяет поддержку ретроспективных проверок и unicodeSets, а не считает их данностью. При экспорте в Python, Go или Rust различия проговариваются, а не превращаются молча во фрагмент, который не соберётся.
Частые вопросы
QОтправляются ли куда-нибудь мой шаблон или тестовый текст?
Нет. Всё выполняется на JavaScript внутри вашей вкладки, включая файлы, которые вы открываете: они читаются браузерным FileReader и никогда не загружаются на сервер. Можно отключиться от интернета — инструмент продолжит работать.
QЧто будет, если я напишу шаблон, который никогда не закончится?
Его убьют. Поиск идёт в Web Worker со сторожевым таймером на две секунды; если воркер не отвечает вовремя, его завершают, а на его место встаёт новый. Это важнее, чем кажется: замерено на том же движке, что и в вашем браузере, — (a+)+$ против 31 символа работал больше четырёх минут. В главном потоке это вкладка, которую вы уже не вернёте.
QКакой движок регулярных выражений используется?
Родной RegExp вашего браузера, поэтому то, что вы тестируете, — ровно то, что сделает ваш JavaScript. Там, где поддержка расходится, инструмент проверяет, а не предполагает: ретроспективные проверки (в Safari они появились только в 16.4), флаг v для unicodeSets и флаг d для позиций групп. Если чего-то нет, вам скажут прямо, вместо непонятной ошибки.
QПочему объяснение шаблона — это дерево?
Потому что плоский список не может показать, что внутри чего, и потому что токенизатор ошибается там, где парсер не ошибается: (?<year>\d{4}) — это именованная группа, а не группа захвата с необязательным символом после неё. Каждая строка связана ровно с теми символами, которые описывает, поэтому при наведении они подсвечиваются в шаблоне.
QПоддерживает ли замена $1 и именованные группы?
Да: от $1 до $99, $<имя>, $& для всего совпадения, $` и $' для текста вокруг и $$ для буквального доллара. Каждый набранный токен перечислен ниже вместе с тем, во что он превратится, а сгенерированный код переписывает их в синтаксис нужного языка — \g<имя> для Python, ${имя} для Java и C#.
QМожно ли работать с большим файлом?
Да, но после 40 000 символов инструмент перестаёт пересчитывать сам и ждёт нажатия кнопки «Выполнить» — искать по большому файлу на каждое нажатие клавиши бессмысленно. Режим «вживую» можно выключить при любом размере и остаться полностью на ручном управлении.
QПочему сгенерированный код для Go идёт с предупреждением?
Go и Rust используют RE2, который по замыслу работает за линейное время и поэтому не имеет ни опережающих, ни ретроспективных проверок, ни обратных ссылок. Если ваш шаблон их использует, фрагмент всё равно показывается, но с пометкой, что в таком виде он не соберётся, — это полезнее, чем фрагмент, который молча падает.
QЧто означают цвета в тестовом тексте?
Каждое совпадение обведено фуксией, а выбранное ярче. Внутри выбранного группы захвата получают собственные фиолетовые участки, так что видно, какие именно символы попали в $1. Удерживайте Alt, чтобы спрятать всю подсветку и прочитать текст таким, какой он есть.