Зворотні посилання: \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

Специфікації

Якщо ви це бачите — значить, щось трапилося з цією сторінкою.

Сумісність із браузерами

Якщо ви це бачите — значить, щось трапилося з цією сторінкою.

Дивіться також