Зворотні посилання: \1, \2
Зворотні посилання стосуються підзбігу попередньої групи захоплення і дають збіг з таким же текстом, як у тій групі. Вкупі з іменованими групами захоплення може бути краще використати іменовані зворотні посилання.
Синтаксис
\N
Примітка:
N
– це не буквально символN
.
Параметри
N
Додатне ціле число, що вказує номер групи захоплення.
Опис
Зворотне посилання – це спосіб шукати збіг з таким же текстом, як той, що раніше дав збіг з групою захоплення. Групи захоплення нумеруються від 1, тому результат першої групи захоплення можна вказати за допомогою \1
, другої – \2
і так далі. \0
– це послідовність екранування для символу NUL.
При чутливому до збігів пошуку збігів зворотні посилання можуть збігатися з текстом іншого регістру, ніж у вихідному тексті.
/(b)\1/i.test("bB"); // true
Зворотне посилання повинно вказувати на наявну групу захоплення. Якщо номер, який вона задає, більший за загальну кількість груп захоплення, викидається синтаксична помилка.
/(a)\2/u; // SyntaxError: Invalid regular expression: Invalid escape
У режимі без урахування Unicode недійсні зворотні посилання стають послідовностями старого вісімкового екранування. Це нерекомендований синтаксис, збережений задля сумісності у Вебі, і на нього не слід покладатися.
/(a)\2/.test("a\x02"); // true
Якщо вказана група захоплення не має збігу (наприклад, через те, що вона належить до альтернативи у диз'юнкції, що не дала збігу), або група ще не спрацювала (наприклад, через те, що вона знаходиться праворуч від зворотного посилання), зворотне посилання завжди має успіх (так, ніби воно збігається з порожнім рядком).
/(?:a|(b))\1c/.test("ac"); // true
/\1(a)/.test("a"); // true
Приклади
Парування лапок
Наступна функція шукає збіг з патернами title='xxx'
and title="xxx"
. Щоб пересвідчитися, що лапки відповідають одна одній, використовується зворотне посилання, щоб вказувати на першу лапку. Звертання до другої групи захоплення ([2]
) повертає рядок між відповідними лапками:
function parseTitle(metastring) {
return metastring.match(/title=(["'])(.*?)\1/)[2];
}
parseTitle('title="foo"'); // 'foo'
parseTitle("title='foo' lang='en'"); // 'foo'
parseTitle('title="Named capturing groups\' advantages"'); // "Named capturing groups' advantages"
Пошук збігу зі словами-дублікатами
Наступна функція шукає у рядку слова-дублікати (котрі зазвичай є хибодруками). Зверніть увагу на те, що вона використовує екранування класу символів \w
, котре дає збіг лише з англійськими літерами, але не з будь-якими літерами з акцентами чи іншими алфавітами. Якщо потрібен більш загальний збіг, можна розбити рядок за пробілами та перебрати отриманий масив.
function findDuplicates(text) {
return text.match(/\b(\w+)\s+\1\b/i)?.[1];
}
findDuplicates("foo foo bar"); // 'foo'
findDuplicates("foo bar foo"); // undefined
findDuplicates("Hello hello"); // 'Hello'
findDuplicates("Hello hellos"); // undefined