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

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

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

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

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

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

Наприклад, [abcd] – те саме, що [a-d]. Це дасть збіг з "b" у "brisket" та "a" чи "c" у "arch", але не з "-" (дефісом) у "non-profit".

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

Наприклад, [\w-] – те саме, що [A-Za-z0-9_-]. Обидва ці класи дають збіг з кожним символом "[email protected]", окрім "@" і ".".

[^xyz]
[^a-c]

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

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

.

Має одне з наступних значень:

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

Зверніть увагу на те, що позначка багаторядковості m ніяк не впливає на логіку крапки. Тож аби патерн давав збіг на кількох рядках, можна використати клас символів [^]: він дасть збіг з будь-яким символом, включно з символами нового рядка.

Позначка "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" у "3D".

\W

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

\s

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

\S

Дає збіг з символом, котрий не є пробільним. Рівносильний [^ \f\n\r\t\v\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+001F). Наприклад, /\cM/ дає збіг з "\r" у "\r\n".

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

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

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

Зверніть увагу, що певні символи, як то :, -, @ тощо не мають спеціального значення ані коли екрановані, ані коли неекрановані. Послідовності екранування виду \:, \-, \@ у регулярних виразах рівносильні власним літеральним, неекранованим еквівалентам. Проте в регулярних виразах з позначкою Unicode вони призводять до помилки invalid identity escape (недійсна екранована одиниця). Так зроблено для надійної зворотної сумісності з наявним кодом, котрий використовує нові послідовності екранування, наприклад, \p чи \k.

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

x|y

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

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

Судження

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

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

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

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

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

$

Дає збіг з кінцем введення. Коли задана позначка багаторядковості, то також дає збіг зразу перед символом розриву рядка. Наприклад, /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".

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

Примітка: Символ ? також може застосовуватись як квантор.

Символи Значення
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]) чи властивостей ($1, …, $9) заздалегідь означеного об'єкта RegExp.
\n

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

\k<Name>

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

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

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

Квантори

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

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

Символи Значення
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" – це 0 або додатне ціле число, а "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>"