Тестер регулярных выражений
Тестируйте регулярные выражения с подсветкой совпадений в реальном времени, группами захвата и предпросмотром замены — полностью в браузере.
Движок: регулярные выражения JavaScript (ECMAScript), выполняемые вашим браузером. Поведение может отличаться от PCRE, Python, Go, Java или .NET.
Разбор шаблона
Введите шаблон, чтобы увидеть его разбор по частям.
Библиотека шаблонов
Нажмите на шаблон, чтобы загрузить его (с примером текста) в тестер.
Один случай на строку. Начните с «+ », если шаблон должен совпасть, или с «- », если НЕ должен (флаги g и y здесь игнорируются).
Создание кода
Введите шаблон, чтобы создать код.
Шаблон копируется как есть (адаптируются только именованные группы, флаги и подстановки замены). Проверьте поддержку lookbehind, обратных ссылок и Unicode в целевом движке.
- \d — любая цифра (0–9)
- \w — любой символ слова (буква, цифра, подчёркивание)
- \s — любой пробельный символ
- . — любой символ, кроме переноса строки
- ^ — начало строки (или строки текста при флаге multiline)
- $ — конец строки (или строки текста при флаге multiline)
- * — ноль или более повторений предыдущего токена
- + — одно или более повторений предыдущего токена
- ? — ноль или одно повторение предыдущего токена
- {n,m} — от n до m повторений
- (...) — захватывающая группа, (?:...) — незахватывающая группа
- \b — граница слова, | — альтернация (ИЛИ)
Как на самом деле работает тестирование регулярного выражения в браузере?
Регулярное выражение — это компактный язык шаблонов для поиска текста: от проверки «похоже ли это на email-адрес» до задачи «найти каждый номер телефона в этом документе» или «удалить HTML-теги из строки». Проблема в том, что синтаксис regex славится тем, что в нём легко ошибиться незаметно для себя: `.`, который нужно было экранировать, жадный `*`, который захватывает больше, чем задумывалось, группа, которая на самом деле захватывает не то, что вы ожидали. Писать выражение вслепую и узнавать, что оно неверно, только когда оно уже работает на реальных данных — не лучший способ усвоить этот урок.
Этот инструмент работает целиком на встроенном движке `RegExp` самого JavaScript и выполняется прямо в вашем браузере в момент ввода — никакого сервера в этой цепочке нет, поэтому текст, на котором вы тестируете шаблон (а это могут быть реальные пользовательские данные, строки логов или что угодно, что вы предпочли бы не вставлять в сторонний сервис), никогда не покидает ваше устройство. Поскольку используется тот же самый движок, который выполнит ваш JavaScript-код в продакшене, всё, что вы видите здесь — какие символы совпадают, как ведут себя жадные квантификаторы, захватила ли группа что-нибудь, — это ровно то, что вы получите во время выполнения, а не приближение от какого-то другого диалекта regex.
Введите шаблон и включите нужные флаги: `g`, чтобы находить все совпадения, а не останавливаться на первом; `i` — для поиска без учёта регистра; `m`, чтобы `^` и `$` совпадали с началом и концом каждой строки текста, а не всей строки целиком; `s`, чтобы `.` совпадал ещё и с переносами строк. Каждое совпадение в тестовой строке подсвечивается в реальном времени, а ниже каждое из них разбирается на полный совпавший текст, его позицию и любые группы захвата — включая именованные группы вроде `(?<year>\d{4})` — так что вы сразу видите, действительно ли группа, которую вы хотели извлечь, захватила именно то, что нужно. Раздел «Замена» показывает именно то, что вернул бы `String.replace()` с вашим шаблоном и строкой замены, включая обратные ссылки на группы вроде `$1` или `$<year>`.
Панель шпаргалки ниже охватывает токены, которые чаще всего забываются посреди работы: разницу между `*` и `+`, для чего нужна незахватывающая группа `(?:...)`, как `\b` обозначает границу слова — всё это без необходимости покидать страницу, чтобы свериться со справочником. Как только у вас получится шаблон, который ведёт себя ожидаемым образом на реалистичных тестовых данных, его можно сразу переносить в код. Если нужно проверить или переформатировать сами окружающие данные, естественными спутниками этого инструмента станут «Форматирование и валидация JSON» и «Сравнение текста».
Часто задаваемые вопросы
Может ли неудачное регулярное выражение «заморозить» страницу?
Нет — поиск выполняется в отдельном Web Worker с жёстким тайм-аутом, поэтому даже шаблон с катастрофическим возвратом не заблокирует вкладку.
Показываются ли именованные и нумерованные группы захвата?
Да — для каждого совпадения перечислены нумерованные группы и все именованные, например (?<year>\d{4}).
Можно ли посмотреть результат замены до использования в коде?
Да — панель замены показывает точно то, что вернул бы String.replace(), включая обратные ссылки на группы.