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

Ця сторінка містить загальну шпаргалку всіх можливостей синтаксису RegExp шляхом компіляції вмісту всіх статей посібника з RegExp. За потреби більше інформації про конкретну тему можна знайти за посиланням на відповідному заголовку, або ж у посібнику.

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

Класи символів розрізняють ґатунки символів, наприклад, розрізняють літери й цифри.

Символи Значення
[xyz]
[a-c]

Клас символів: Дає збіг з одним із символів у дужках. За допомогою дефіса можна задати діапазон символів, але якщо дефіс стоїть першим або останнім символом у квадратних дужках, то сприймається як буквальний символ дефіса, що є частиною описаного класу символів.

Наприклад, [abcd] – те саме, що [a-d]. Це дасть збіг з "b" у "brisket" і "c" у "chop".

Наприклад, [abcd-] і [-abcd] дають збіг з "b" у "brisket", "c" у "chop" і "-" (дефісом) у "non-profit".

Наприклад, [\w-] – те саме, що [A-Za-z0-9_-]. Обидва ці класи дають збіг з "b" у "brisket", "c" у "chop" і "n" у "non-profit".

[^xyz]
[^a-c]

Клас символів із запереченням: Дає збіг з чим завгодно, чого немає у квадратних дужках. За допомогою дефіса можна задати діапазон символів, але якщо дефіс стоїть першим символом після ^ або останнім у дужках, то сприймається як буквальний дефіс, що стає членом класу символів, як звичайний символ. Наприклад, [^abc] – те саме, що [^a-c]. Ці класи дають збіг з "o" у "bacon" і "h" у "chop".

Примітка: Символ ^ може також вказувати на початок введення.

.

Джокер: Дає збіг з кожним символом, окрім символів кінця рядка: \n, \r, \u2028 і \u2029. Наприклад, /.y/ у "yes make my day" дає збіг з "my" і "ay", але не з "yes", адже перед "y" у "yes" не стоїть інша літера. Якщо ввімкнена позначка dotAll (s), то джокер також дає збіг з символами кінця рядка. Всередині класу символів крапка втрачає своє особливе значення та дає збіг з буквальною крапкою.

\d

Екранувальний клас цифрових символів: Дає збіг з будь-якою (арабською) цифрою. Рівносильний [0-9]. Наприклад, /\d/ і /[0-9]/ дають збіг з "2" у "B2 is the suite number".

\D

Екранувальний клас нецифрових символів: Дає збіг з будь-яким символом, котрий не є (арабською) цифрою. Рівносильний [^0-9]. Наприклад, /\D/ і /[^0-9]/ дають збіг з "B" у "B2 is the suite number".

\w

Екранувальний клас літер: Дає збіг з будь-яким алфавітно-цифровим символом базового латинського алфавіту, включно з підкресленням. Рівносильний [A-Za-z0-9_]. Наприклад, /\w/ дає збіг з "a" у "apple", "5" у "$5.28" і "3" in "3D" and "m" in "Émanuel".

\W

Екранувальний клас нелітер: Дає збіг з будь-яким символом, що не є алфавітно-цифровим символом базового латинського алфавіту. Рівносильний [^A-Za-z0-9_]. Наприклад, /\W/ і /[^A-Za-z0-9_]/ дають збіг з "%" у "50%" and "É" in "Émanuel".

\s

Екранувальний клас пробільних символів: Дає збіг з пробільним символом, в тому числі пробілом, табуляцією, розривом сторінки, розривом рядка та іншими пробілами Unicode. Рівносильний [\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]. Наприклад, /\s\w*/ дає збіг з " bar" у "foo bar".

\S

Екранувальний клас непробільних символів: Дає збіг з символом, котрий не є пробільним. Рівносильний [^\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]. Наприклад, /\S\w*/ дає збіг з "foo" у "foo bar".

\t Дає збіг з горизонтальною табуляцією.
\r Дає збіг з поверненням каретки.
\n Дає збіг з розривом рядка.
\v Дає збіг з вертикальною табуляцією.
\f Дає збіг з розривом сторінки.
[\b] Дає збіг із забоєм. Якщо шукаєте судження про кінець слова (\b), то погляньте в Судженнях.
\0 Дає збіг з символом NUL. Не ставте після цього класу інші цифри.
\cX

Дає збіг з контрольним символом, що використовує каретний запис, де "X" – літера з діапазону A–Z (відповідає кодовим точкам U+0001U+001A). Наприклад, /\cM\cJ/ дає збіг з "\r" у "\r\n".

\xhh Дає збіг з символом із кодом hh (за двома шістнадцятковими цифрами).
\uhhhh Дає збіг з кодовою одиницею UTF-16, чиє значення – hhhh (задане чотирма шістнадцятковими цифрами).
\u{hhhh} або \u{hhhhh} (Лише тоді, коли задана позначка u.) Дає збіг з символом, чиє значення Unicode – U+hhhh або U+hhhhh (задається шістнадцятковими цифрами).
\p{UnicodeProperty}, \P{UnicodeProperty}

Екранувальний клас символу Unicode: Дає збіг з символом на основі властивостей його символу Unicode: наприклад, символи емоджі, чи японські символи катакана, або китайсько-японські знаки Хань чи кандзі тощо).

\

Позначає те, що наступний символ повинен сприйматися по-особливому, або ж бути "екранованим". Має один з двох наслідків.

  • Для символів, що зазвичай сприймаються буквально, позначає те, що наступний символ є спеціальним і не повинен тлумачитися буквально. Наприклад, /b/ дає збіг з символом "b". Коли поставити перед "b" зворотну скісну риску, тобто застосувати /\b/, то цей символ стає спеціальним і позначає межу слова.
  • Для символів, котрі зазвичай сприймаються по-особливому, вказує, що наступний символ не є спеціальним і повинен тлумачитись буквально. Наприклад, "*" – спеціальний символ, котрий збіг з 0 або більше входженнями символу перед ним; наприклад, /a*/ означає 0 або більше входжень літери "a". Щоб отримати збіг буквально з *, перед нею треба поставити зворотну скісну риску; наприклад, /a\*/ дасть збіг з "a*".

Примітка: Щоб отримати буквальний збіг з цим символом, його треба екранувати самим собою. Інакше кажучи, для пошуку \ слід застосовувати /\\/.

x|y

Диз'юнкція: Дає збіг або з "x", або з "y". Кожна складова, відділена вертикальною рискою (|), зветься варіантом. Наприклад, /green|red/ дає збіг з "green" у "green apple" і з "red" у "red apple".

Примітка: Диз'юнкція – іще один спосіб задати "варіанти вибору", але вона не є класом символів. Диз'юнкції не є атомарними: необхідно застосувати групу, аби зробити її частиною більшого патерну. Патерн [abc] у дії рівносильний (?:a|b|c).

Судження

Судження включають межі, котрі позначають початок і кінець рядків та слів, а також інші патерни, котрі в певний спосіб позначають те, що збіг можливий (включно з зазиральними, озиральними та умовними виразами).

Судження типу межі

Символи Значення
^

Судження початкової межі введення: Дає збіг з початком введення. Якщо задана позначка multiline (m), то також дає збіг зразу після символу розриву рядка. Наприклад, /^A/ не дає збігу з "A" в "an A", але дає збіг з першою "A" в "An A".

Примітка: Цей символ має інакше значення, коли зустрічається на початку класу символів.

$

Судження кінцевої межі введення: Дає збіг з кінцем введення. Якщо задана позначка multiline (m), то також дає збіг зразу перед символом розриву рядка. Наприклад, /t$/ не дає збігу з "t" в "eater", але дає – в "eat".

\b

Судження про межу слова: Дає збіг з межею слова. Це положення, в якому перед або після алфавітно-цифрового символу не стоїть інший алфавітно-цифровий символ, як то між літерою та пробілом. Зверніть увагу, що межа слова, що дала збіг, не включається у збіг. Інакше кажучи, довжина збігу з межею слова – нуль.

Приклади:

  • /\bm/ дає збіг з "m" у "moon".
  • /oo\b/ не дає збігу з "oo" у "moon", тому що після "oo" стоїть "n", котра є алфавітно-цифровим символом.
  • /oon\b/ дає збіг з "oon" у "moon", тому що "oon" – кінець рядка, після якого не стоїть алфавітно-цифровий символ.
  • /\w\b\w/ ніколи не дасть жодного збігу, тому що після алфавітно-цифрового символу не може водночас стояти не алфавітно-цифровий і алфавітно-цифровий символ.

Про збіг із символом забою ([\b]) – у Класах символів.

\B

Судження про відсутність межі слова: Дає збіг з положенням, котре не є межею слова. Це таке положення, в якому і попередній, і наступний символи належать до одно типу: Або обидва алфавітно-цифрові, або обидва не алфавітно-цифрові, наприклад, між двома літерами або між двома пробілами. Початок і кінець рядка вважаються не алфавітно-цифровими символами. Так само, як зі збігом межі слова, збіг з не межею слова не включається до збігу. Наприклад, /\Bon/ дає збіг з "on" у "at noon", а /ye\B/ дає збіг з "ye" у "possibly yesterday".

Інші судження

[!NOTE] Символ ? також може застосовуватись як квантифікатор.

Символи Значення
x(?=y)

Судження зазирання: Дає збіг з "x" лише тоді, коли "x" стоїть перед "y". Наприклад, /Jack(?=Sprat)/ дає збіг з "Jack" лише тоді, коли далі стоїть "Sprat".
/Jack(?=Sprat|Frost)/ дає збіг з "Jack" лише тоді, коли далі стоїть "Sprat" або "Frost". Проте ані "Sprat", ані "Frost" не є частинами результатів зіставлення.

x(?!y)

Судження зазирання з запереченням: Дає збіг з "x" лише тоді, коли "x" не стоїть перед "y". Наприклад, /\d+(?!\.)/ дає збіг з числом лише тоді, коли після нього не стоїть десятковий розділювач. /\d+(?!\.)/.exec('3.141') дасть збіг з "141", але не з "3".

(?<=y)x

Судження озирання: Дає збіг з "x" лише тоді, коли "x" стоїть після "y". Наприклад, /(?<=Jack)Sprat/ дає збіг зі "Sprat" лише тоді, коли перед цим стоїть "Jack". /(?<=Jack|Tom)Sprat/ дає збіг зі "Sprat" лише тоді, коли перед цим стоїть "Jack" або "Tom", Утім, ані "Jack", ані "Tom" не є частиною результатів зіставлення.

(?<!y)x

Судження озирання з запереченням: Дає збіг з "x" лише тоді, коли "x" не стоїть після "y". Наприклад, /(?<!-)\d+/ дає збіг з числом лише тоді, коли перед ним не стоїть знак мінуса. /(?<!-)\d+/.exec('3') дає збіг з "3". Зіставлення /(?<!-)\d+/.exec('-3') не знаходить збігу, тому що перед числом стоїть знак мінуса.

Групи та зворотні посилання

Групи та зворотні посилання вказують на групи символів-виразів.

Символи Значення
(x)

Група захоплення: Дає збіг з x і запам'ятовує збіг. Наприклад, /(foo)/ дає збіг і запам'ятовує "foo" у "foo bar".

Регулярний вираз може мати декілька груп захоплення. Як наслідок, збіги з групами захоплення здебільшого зберігаються в масиві, чиї елементи мають такий же порядок, як їхні ліві дужки в патерні. Зазвичай це просто порядок самих груп захоплення. Це стає важливим, коли групи захоплення мають вкладеність. Збіги доступні через індекси елементів результату ([1], …, [n]) і через наперед визначені властивості об'єкта RegExp ($1, …, $9).

Групи захоплення шкодять швидкодії. Коли немає потреби згадувати підрядки, що збіглися — слід віддавати перевагу дужкам без захоплення (дивіться нижче).

String.prototype.match() не поверне груп, якщо задана позначка /.../g. Проте і в такому випадку можна застосувати для отримання всіх збігів String.prototype.matchAll().

(?<Name>x)

Іменована група захоплення: Дає збіг з "x" і зберігає його у властивості `groups` повернених збігів, за ім'ям, заданим у вигляді <Name>. Кутові дужки (< і >) для назви групи — обов'язкові.

Наприклад, для виділення з телефонного номера коду місцевості в Сполучених штатах можна застосувати /\((?<area>\d\d\d)\)/. Результівний номер місцевості буде доступний через matches.groups.area.

(?:x)

Група без захоплення: Дає збіг з "x", але не запам'ятовує його. Підрядок-збіг не можна отримати з елементів результівного масиву ([1], …, [n]) чи наперед визначених властивостей об'єкта RegExp ($1, …, $9).

(?flags:x), (?:flags-flags:x)

Модифікатор: Вмикає чи вимикає конкретні позначки лише для патерну в дужках. В модифікаторах можна застосовувати лише позначки i, m і s.

\n

Зворотне посилання: Де "n" – це додатне ціле число. Дає збіг з тим же підрядком, що був збігом групи захоплення номер n у тому самому регулярному виразі (рахуючи за лівою дужкою). Наприклад, /apple(,)\sorange\1/ дає збіг з "apple, orange," у "apple, orange, cherry, peach".

\k<Name>

Іменоване зворотне посилання: Зворотне посилання на останній підрядок, що дав збіг з Іменованою групою захоплення, заданою як <Name>.

Наприклад, /(?<title>\w+), yes \k<title>/ у "Do you copy? Sir, yes Sir!" дає збіг "Sir, yes Sir".

Примітка: \k тут використовується буквально – для позначення початку зворотного посилання на Іменовану групу захоплення.

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

Квантифікатори позначають кількість символів або виразів, котрі повинні давати збіг.

[!NOTE] У тексті нижче елементами звуться не лише окремі символи, а й також класи символів і групи та зворотні посилання.

Символи Значення
x*

Дає збіг з попереднім елементом "x" 0 або більше разів. Наприклад, /bo*/ дає збіг з "boooo" у "A ghost booooed" і "b" у "A bird warbled", але не дає жодного збігу в "A goat grunted".

x+

Дає збіг з попереднім елементом "x" 1 або більше разів. Рівносильно {1,}. Наприклад, /a+/ дає збіг з "a" у "candy" і всіма літерами "a" у "caaaaaaandy".

x?

Дає збіг з попереднім елементом "x" 0 або 1 раз. Наприклад, /e?le?/ дає збіг з "el" у "angel" і "le" у "angle."

Бувши застосованим зразу після одного з наступних квантифікаторів: *, +, ? і {}, робить такий квантифікатор нежадібним (змушує його дати збіг з якнайменшою кількістю входжень), на противагу усталеній поведінці – жадібній (коли збіг дається з якнайбільшою кількістю входжень).

x{n}

Де "n" – це невід'ємне ціле число, дає збіг з рівно "n" входженнями попереднього елемента "x". Наприклад, /a{2}/ не дає збігу з "a" у "candy", але дає збіг з усіма "a" у "caandy", а також першими двома "a" у "caaandy".

x{n,}

Де "n" – це невід'ємне ціле число, дає збіг зі щонайменше "n" входженнями попереднього елемента "x". Наприклад, /a{2,}/ не дає збігу з "a" у "candy", але дає збіг з усіма a у "caandy" та в "caaaaaaandy".

x{n,m}

Де "n" і "m" – це невід'ємні цілі числа, і m >= n, дає збіг зі щонайменше "n" і щонайбільше "m" входженнями попереднього елемента "x". Наприклад, /a{1,3}/ не дає жодного збігу в "cndy", дає збіг з "a" у "candy", зі двома "a" у "caandy" і першими трьома "a" у "caaaaaaandy". Зверніть увагу, що при зіставленні з "caaaaaaandy" збігом є "aaa", навіть попри те, що у вихідному рядку більше літер "a".

x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?

Усталено квантифікатори штибу * і + є "жадібними", тобто намагаються дати збіг з якомога більшою частиною рядка. Символ ? після квантифікатора робить такий квантифікатор "нежадібним", тобто він зупиниться, щойно знайде який-небудь збіг. Наприклад, у рядку "some <foo> <bar> new </bar> </foo> thing":

  • /<.*>/ дасть збіг "<foo> <bar> new </bar> </foo>"
  • /<.*?>/ дасть збіг "<foo>"