Перейти до вмісту

Шпаргалка з регулярних виразів

Регулярні вирази достатньо компактні, тож синтаксис легше знайти в довіднику, ніж запам'ятати. Ця сторінка вміщує його весь на одному екрані — класи, квантифікатори, якорі, групи, lookaround, екранування й прапорці — з робочим прикладом для кожного рядка.

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

Дві речі спричиняють більшість несподіванок. Квантифікатори жадібні: вони беруть усе, що можуть, і віддають назад лише тоді, коли решта шаблону не збігається, тому <.+> поглинає два теги, а <.+?> ні. А альтернація зв'язує найслабше з усього, тож ^a|b$ означає "починається з a або закінчується на b" — не те, що більшість людей мають на увазі, коли це пишуть.

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

11

Скорочення працюють лише з ASCII, доки ви не додасте прапорець u й не використаєте екранування властивостей 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Розглядає шаблон як кодові точки й вмикає екранування властивостей \p{…}.
yЛипкийЗбігається лише точно на lastIndex, ніколи не шукаючи вперед.

FAQ

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