Перейти к содержанию

Шпаргалка по регулярным выражениям

Регулярные выражения достаточно компактны, чтобы синтаксис было проще посмотреть, чем запомнить. Эта страница — весь он на одном экране: классы, квантификаторы, якоря, группы, lookaround, экранирование и флаги — с рабочим примером для каждой строки.

Диалект — JavaScript, тот, что работает в вашем браузере и который использует тестер регулярных выражений на этом сайте. Большая часть идентична в Python, Java, Go и PCRE; там, где диалекты расходятся, они расходятся на краях — поддержка lookbehind, синтаксис именованных групп и то, означает ли \d «цифру ASCII» или «любую цифру Unicode».

Большинство неожиданностей объясняются двумя вещами. Квантификаторы жадные: они забирают всё, что могут, и отдают обратно, только когда остальная часть шаблона не совпадает, поэтому <.+> проглатывает два тега, а <.+?> нет. А альтернатива связывает слабее всего, поэтому ^a|b$ означает «начинается с a или заканчивается на b» — не то, что большинство людей имеют в виду, когда это пишут.

Классы символов

11

Сокращения работают только с ASCII, пока вы не добавите флаг u и не используете escape-последовательности свойств Unicode.

СинтаксисЗначениеПример
.Любой символ, кроме разрыва строкиДобавьте флаг s, чтобы он совпадал и с символами новой строки./a.c/"abc" "abc"
\dЦифра, 0–9/\d+/"order 42" "42"
\DВсё, что не является цифрой/\D+/"42abc" "abc"
\wБуква, цифра или подчёркиваниеТолько ASCII — «é» не является \w./\w+/"user_1!" "user_1"
\WВсё, с чем не совпадает \w/\W+/"a++b" "++"
\sЛюбой пробельный символ, включая табуляции и символы новой строки/\s+/"a \t b" " \t "
\SЛюбой непробельный символ/\S+/" hi" "hi"
[abc]Любой из перечисленных символов/[aeiou]/"rhythm and" "a"
[^abc]Любой символ, кроме перечисленных/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Диапазон символов/[a-f]+/"zzabcz" "abc"
\p{L}Любая буква Unicode (нужен флаг u)/\p{L}+/"42 café" "café"

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

7

Все они по умолчанию жадные: забирают как можно больше и отдают обратно, только если остальная часть шаблона не совпадает.

СинтаксисЗначениеПример
*Ноль или больше/ab*/"a" "a"
+Один или больше/ab+/"abbb" "abbb"
?Ноль или один — делает необязательным/colou?r/"color" "color"
{3}Ровно три/\d{3}/"id 12345" "123"
{2,}Два или больше/a{2,}/"aaa" "aaa"
{2,4}От двух до четырёх/a{2,4}/"aaaaa" "aaaa"
*?Ленивый — берёт как можно меньшеЖадный <.+> проглотил бы оба тега./<.+?>/"<a><b>" "<a>"

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

4

Они совпадают с позицией, а не с символом, поэтому ничего не поглощают.

СинтаксисЗначениеПример
^Начало всего текста, а с флагом m — начало каждой строки./^a/"abc" "a"
$Конец всего текста, а с флагом m — конец каждой строки./c$/"abc" "c"
\bГраница словаИменно это не даёт «cat» совпадать внутри «concatenate»./\bcat\b/"the cat sat" "cat"
\BНе граница слова/\Bcat/"concatenate" "cat"

Группы и альтернатива

5
СинтаксисЗначениеПример
(abc)Захватывающая группа — запоминается для замены/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Группировка без захватаИспользуйте это, когда нужна только группировка; так номера захватов остаются осмысленными./(?:ab)+/"abab" "abab"
(?<name>…)Именованная захватывающая группа/(?<year>\d{4})/"in 2026" "2026"
a|bОдна из сторон — альтернативаУ альтернативы самый низкий приоритет: ^a|b$ означает «^a» или «b$», а не «^(a|b)$»./cat|dog/"one dog" "dog"
\1Обратная ссылка на первую группу/(\w)\1/"letter" "tt"

Lookaround

4

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

СинтаксисЗначениеПример
(?=…)Lookahead — за которым следует это/\d+(?= kg)/"80 kg" "80"
(?!…)Негативный lookahead — за которым не следует это/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — которому предшествует это/(?<=\$)\d+/"costs $40" "40"
(?<!…)Негативный lookbehind — которому не предшествует это/(?<!\$)\b\d+/"about 40" "40"

Экранирование

5

Эти двенадцать символов — те, которым нужна обратная косая черта, чтобы восприниматься буквально.

СинтаксисЗначениеПример
\.Буквальная точка/\d\.\d/"v2.5" "2.5"
\\Буквальная обратная косая черта/\\/"C:\\dir" "\\"
\nПеревод строки/a\nb/"a\nb" "a\nb"
\tСимвол табуляции/a\tb/"a\tb" "a\tb"
\uFFFFСимвол по его кодовой точке/\u00e9/"café" "é"

Флаги

6
ФлагНазваниеЗначение
gГлобальныйНаходит все совпадения, а не только первое.
iИгнорировать регистрСовпадает независимо от верхнего или нижнего регистра.
mМногострочныйЗаставляет ^ и $ совпадать на каждом разрыве строки, а не только в концах всего текста.
sТочка совпадает со всемПозволяет . совпадать и с разрывами строк.
uUnicodeРассматривает шаблон как кодовые точки и включает escape-последовательности свойств \p{…}.
yЛипкийСовпадает только точно на lastIndex, никогда не выполняя поиск вперёд.

FAQ

В чём разница между жадными и ленивыми квантификаторами?
Жадные квантификаторы (*, +, {2,}) совпадают с как можно большим и отдают символы обратно, только когда остальная часть шаблона не может совпасть. Добавление ? делает их ленивыми: они совпадают с как можно меньшим и берут больше только по необходимости. На «<a><b>» шаблон <.+> возвращает всю строку, а <.+?> возвращает только <a>.
Почему моё слово совпадает внутри других слов?
Потому что ничто его не привязало. Оберните слово в \b — /\bcat\b/ совпадает с «cat» в «the cat sat», но не внутри «concatenate». \b совпадает с позицией между символом слова и не-символом слова, поэтому ничего не поглощает.
Что меняет флаг u?
Он заставляет шаблон работать с кодовыми точками, а не с единицами UTF-16, поэтому одно эмодзи считается одним символом, и включает escape-последовательности свойств \p{…}, такие как \p{L} для «любой буквы». Без него \w и \d остаются только ASCII, поэтому «café» не полностью совпадает с /\w+/.
Когда следует использовать незахватывающую группу?
Всякий раз, когда вам нужна группировка, но не захваченный текст — (?:ab)+ вместо (ab)+. Захваты немного стоят производительности, но настоящая причина — нумерация: каждая захватывающая группа, которую вы добавляете, сдвигает номера тех, что после неё, незаметно ломая замены, использующие $1 и $2.
Безопасно ли использовать lookbehind?
В современных браузерах и Node — да: (?<=…) и (?<!…) поддерживаются во всех основных движках с 2018 года. Safari добавил это последним. Если вы ориентируетесь на очень старые среды выполнения, сначала проверьте; для синтаксиса регулярных выражений нет полифила.