bitlvl
RU

Шпаргалка по regex

Синтаксис, общий для всех основных движков, с различиями в одной таблице в конце.

Помещается на одну вертикальную страницу A4 / Letter; выберите «Сохранить как PDF» в диалоге печати, чтобы оставить себе копию.

Якоря и границы

^ $начало / конец текста (строки с флагом m)
\A \z \Zначало / конец текста независимо от флагов (нет в JS)
\b \Bграница слова / не граница

Символы

.любой символ, кроме перевода строки (любой с флагом s)
\d \w \sцифра, символ слова, пробельный; \D \W \S — отрицание
[abc] [a-z] [^abc]набор, диапазон, инвертированный набор
[\]\\^-]внутри набора экранировать нужно только ] \ ^ -
\t \n \r \xHH \uHHHHтабуляция, перевод строки, CR, hex, Unicode
\p{L} \p{Lu} \p{N} \p{Script=Cyrillic}свойства Unicode (флаг u в JS)
[[:alpha:]] [[:digit:]]POSIX-классы (grep, PCRE; не JS)
\. \* \( \\экранированный метасимвол = литерал

Квантификаторы

* + ?0+, 1+, 0 или 1
{n} {n,} {n,m}ровно, не менее, от и до
*? +? ?? {n,m}?ленивые: как можно меньше
*+ ++ ?+притяжательные: без отката (PCRE, Java)

Группы

(abc)захват, нумерация с 1
(?:abc)без захвата
(?<name>abc)именованная (Python: (?P<name>…))
\1 \k<name>обратная ссылка (Python: (?P=name))
a|bальтернатива (самый низкий приоритет)
(?>abc)атомарная группа (PCRE, Java)
(?i)abc (?i:abc)встроенный флаг, встроенный флаг с областью действия

Lookaround (нулевой ширины)

(?=x)за которым следует x
(?!x)за которым не следует x
(?<=x)которому предшествует x
(?<!x)которому не предшествует x

Флаги

gвсе совпадения (JS, PHP через функцию)
iигнорировать регистр
m^ $ совпадают на границах строк
s. совпадает с переводом строки (DOTALL)
xигнорировать пробелы и комментарии # в шаблоне (PCRE, Python; не JS)
uUnicode (JS); нужен для \p{}
ysticky (JS)

Замена

$1 $<name> $&JS, .NET: группа, именованная, всё совпадение
\1 \g<name>Python re.sub
$1 \1 ${name}PCRE / PHP preg_replace; Go использует $1 и ${name}
sed 's/(a)(b)/\2\1/'sed -E (базовому sed нужны \( \))

Типовые шаблоны

^\s*$пустая строка
\s+$пробелы в конце строки
\b(?:\d{1,3}\.){3}\d{1,3}\bIPv4 (нестрого)
[\w.+-]+@[\w-]+(?:\.[\w-]+)+email (практичный)
https?://[^\s"'<>]+URL
\d{4}-\d{2}-\d{2}дата ISO
#(?:[0-9a-fA-F]{3}){1,2}\bhex-цвет
"(?:[^"\\]|\\.)*"строка в двойных кавычках с экранированием
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$пароль с цифрой, строчной, заглавной, 8+
(\w+)\s+\1повторяющееся слово

Различия диалектов

JavaScriptнет \A \z, нет флага x, нет притяжательных/атомарных; lookbehind есть; именованные группы (?<n>)
PCRE (PHP, nginx, HAProxy)всё; разделители /…/ в PHP
Python re(?P<n>), нет притяжательных до 3.11, \Z = конец
Go RE2, Rust regexлинейное время; нет lookaround, нет обратных ссылок
grep -E / sed -EERE: нет \d (используйте [0-9]), POSIX-классы, нет ленивых квантификаторов
grep (базовый)\( \) \{ \} \+ \? экранируются, чтобы стать специальными
Javaпритяжательные, атомарные; в строках нужны двойные обратные слеши

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

Вопросы

Где можно проверить шаблон?

Тестер regex подсвечивает совпадения в реальном времени, перечисляет группы, показывает предпросмотр замены и объясняет шаблон по токенам.