Шпаргалка
| Токен | Совпадает с |
|---|---|
| . | Любой символ, кроме перевода строки (с флагом 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.
Распространённые шаблоны
Вопросы
Почему мой шаблон совпадает только один раз?
Без флага g regex находит только первое совпадение. Добавьте g, чтобы найти все. В коде используйте matchAll, re.findall или preg_match_all для того же эффекта.
Почему .* захватывает слишком много?
Квантификаторы жадные: .* берёт как можно больше и отступает, только если остальная часть не совпадает. Используйте .*? для кратчайшего совпадения или инвертированный класс вроде [^"]*, который и быстрее, и понятнее.
Как найти буквальную точку или скобку?
Экранируйте обратным слешем: \. \[ \( \\. У инструмента экранирования строк есть режим regex, который экранирует целый литерал за вас.
Что такое катастрофический откат (backtracking)?
Вложенные квантификаторы вроде (a+)+ на несовпадающем входе заставляют движок перебирать экспоненциально много путей и зависать. Не вкладывайте квантификаторы над пересекающимися множествами, используйте притяжательные или атомарные группы там, где движок их поддерживает, либо используйте RE2 (Go, regex в Rust), который гарантирует линейное время.