Язык: Русский Перейти на английский

Тестер Regex

Тестируйте регулярные выражения JavaScript в реальном времени. Подсвеченные совпадения и группы захвата в списке.

/ /

Подсвеченные совпадения

 

Совпадения и группы

  1. Введите regex-шаблон в поле выше (не нужно оборачивать его в слэши).
  2. Переключайте нужные флаги: g для всех совпадений, i для без учета регистра и т.д.
  3. Вставьте или введите тестовую строку в поле Тестовая строка.
  4. Наблюдайте за подсветкой совпадений в реальном времени; изучайте захваченные группы в таблице ниже.
Что это делает?

Этот тестер запускает ваш шаблон против тестовой строки, используя встроенный в браузер движок RegExp — тот же, что используют Node.js, Deno и каждый браузер. Совпадения подсвечиваются встроенно. Нумерованные и именованные группы захвата извлекаются в таблицу, чтобы вы точно видели, что поймал каждый сегмент в скобках.

Пример

Шаблон (с флагом g):

\b(\w+)@(\w+\.\w+)\b

Тестовая строка:

Contact us at [email protected] or [email protected]. Not an email: foo@bar (no TLD).

Совпадения:

1  [email protected]        $1: hello    $2: example.com
2  [email protected]   $1: support  $2: happycoder.dev

foo@bar не совпадает, потому что \w+\.\w+ требует точку в домене.

Почему мой regex не совпадает?

  • Забыли флаг g. Без него возвращается только первое совпадение. /cat/.exec("cat cat") находит один "cat"; /cat/g находит оба.
  • Не-экранированные метасимволы. example.com также совпадает с examplexcom, потому что . соответствует любому символу. Экранируйте: example\.com.
  • Жадное совпадение потребляет слишком много. <.*> на <a><b> захватывает всю штуку. Используйте ленивое <.*?> или <[^>]*>, чтобы остановиться на первом >.
  • Путаница с границей слова. \b — это позиция между словесным и не-словесным символом. Шаблоны вроде \bfoo-bar\b не работают, потому что - уже является не-словесной границей в середине.
  • Несоответствие регистра. [a-z]+ не будет совпадать с Hello. Добавьте флаг i или включите [A-Za-z]+.
  • Многострочные ^ / $. Без флага m они привязываются только к целой строке, а не к каждой линии. Включите m, если сканируете строки лога.
Часто задаваемые вопросы

Какой вариант regex использует этот тестер?

Regex JavaScript (ECMAScript), через встроенный в браузер движок RegExp. Он отличается от PCRE (PHP, Perl), модуля re Python и POSIX regex в нескольких отношениях: нет рекурсии, нет поссессивных квантификаторов, именованные группы используют (?<name>...) вместо (?P<name>...), а сокращения классов символов, такие как \d, только ASCII, если вы не добавите флаг u.

Поддерживает ли он lookbehind?

Да. Lookbehind-утверждения вроде (?<=foo)bar и (?<!foo)bar были добавлены в ES2018 и поддерживаются во всех текущих сборках Chromium, Firefox и Safari. Если вы нацелены на очень старые браузеры в продакшене, проверьте caniuse, прежде чем полагаться на них — но сам этот тестер запускает их нормально.

Что означают флаги g, i, m, s и u?

g находит каждое совпадение, а не только первое. i делает совпадение нечувствительным к регистру. m заставляет ^ и $ совпадать с началом и концом каждой строки, а не всей строки. s (dotall) заставляет . совпадать с переводами строк. u включает полную обработку Unicode и более строгий разбор escape. Выбирайте только нужные флаги — особенно g меняет количество получаемых совпадений.

Почему мой жадный квантификатор совпадает со слишком многим?

Квантификаторы вроде *, + и {n,} по умолчанию жадные — они совпадают с максимальным количеством и отдают обратно, только если остальная часть шаблона не срабатывает. Добавьте ?, чтобы сделать их ленивыми: .*? совпадает с минимальным количеством. Обычное исправление для <a>.*</a>, поедающего несколько тегов: используйте <a>.*?</a> или негированный класс <a>[^<]*</a>.

Как ссылаться на захваченную группу позже в шаблоне или замене?

Внутри шаблона используйте \1, \2 и т.д. для соответствия тому же тексту, что захватила предыдущая группа — (\w+)\s+\1 совпадает с повторяющимися словами. В строке замены (не поддерживается в этом живом тестере, но в String.replace) используйте $1, $2. Именованные группы используют \k<name> внутри шаблона и $<name> в заменах.

Почему мой regex ломается, когда шаблон содержит точку, слэш или скобку?

Это метасимволы regex. Чтобы соответствовать им буквально, экранируйте обратным слэшем: \. для точки, \/ для слэша (необязательно в строке new RegExp, требуется между литералами /.../), \( и \) для скобок. Специальные символы — . * + ? ^ $ { } ( ) | [ ] \ — любой из них как буквальный текст требует экранирования.

Сохраняете ли вы regex или тестовый текст, который я здесь ввожу?

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