bitlvl
RU

Тестер regex

Введите шаблон и флаги, вставьте текст для поиска. Совпадения подсвечиваются по мере ввода, каждая группа перечислена, а шаблон объясняется по частям.

//

Совпадения

Замена

 

Пояснение

Результаты и сообщения этого инструмента выводятся на английском языке.

Шпаргалка

ТокенСовпадает с
.Любой символ, кроме перевода строки (с флагом s: любой символ)
\d \w \sЦифра; символ слова [A-Za-z0-9_]; пробельный символ. Заглавная буква инвертирует: \D \W \S
[abc] [^abc] [a-z]Класс символов, инвертированный класс, диапазон
^ $Начало и конец ввода (каждой строки с флагом m)
\bГраница слова
* + ? {n} {n,} {n,m}0 или более, 1 или более, 0 или 1, ровно n, n или более, от n до m
*? +? ??Ленивые (кратчайшие) версии
(abc)Группа захвата, нумеруется с 1
(?<name>abc)Именованная группа, ссылка через \k<name> и $<name>
(?:abc)Группа без захвата
a|bАльтернатива
(?=x) (?!x) (?<=x) (?<!x)Lookahead, негативный lookahead, lookbehind, негативный lookbehind
\1Обратная ссылка на группу 1
\p{L} \p{Script=Cyrillic}Свойство Unicode (требует флага u)

Флаги

g найти все совпадения, а не только первое; i игнорировать регистр; m ^ и $ совпадают на границах строк; s позволяет . совпадать с переводом строки; u режим Unicode (нужен для \p{…} и корректной обработки эмодзи); y sticky, совпадение только в позиции lastIndex.

Диалекты

Этот тестер использует движок JavaScript. Приведённый синтаксис совпадает с PCRE (PHP, nginx, HAProxy), модулем re в Python и Java почти во всём, что вы будете писать; различия — на периферии: Python именует группы как (?P<name>…), RE2 в Go и grep -E не имеют lookbehind и обратных ссылок, а POSIX-классы вроде [[:digit:]] — не JavaScript. Атомарные группы и притяжательные квантификаторы есть только в PCRE и Java.

Распространённые шаблоны

Адрес IPv4 (нестрого)
\b(?:\d{1,3}\.){3}\d{1,3}\b
Email (практичный)
[\w.+-]+@[\w-]+(?:\.[\w-]+)+
Дата ISO
(?<y>\d{4})-(?<m>0[1-9]|1[0-2])-(?<d>0[1-9]|[12]\d|3[01])
Hex-цвет
#(?:[0-9a-f]{3}){1,2}\b
Убрать пробелы в конце строк
[ \t]+$ (флаги gm, заменить на пустую строку)

Вопросы

Почему мой шаблон совпадает только один раз?

Без флага g regex находит только первое совпадение. Добавьте g, чтобы найти все. В коде используйте matchAll, re.findall или preg_match_all для того же эффекта.

Почему .* захватывает слишком много?

Квантификаторы жадные: .* берёт как можно больше и отступает, только если остальная часть не совпадает. Используйте .*? для кратчайшего совпадения или инвертированный класс вроде [^"]*, который и быстрее, и понятнее.

Как найти буквальную точку или скобку?

Экранируйте обратным слешем: \. \[ \( \\. У инструмента экранирования строк есть режим regex, который экранирует целый литерал за вас.

Что такое катастрофический откат (backtracking)?

Вложенные квантификаторы вроде (a+)+ на несовпадающем входе заставляют движок перебирать экспоненциально много путей и зависать. Не вкладывайте квантификаторы над пересекающимися множествами, используйте притяжательные или атомарные группы там, где движок их поддерживает, либо используйте RE2 (Go, regex в Rust), который гарантирует линейное время.