Вміст груп захоплення (...) можна використовувати не тільки в резульаті пошуку чи рядку заміни, а й також безпосередньо у самому шаблоні.
Зворотнє посилання за номером: \N
До групи можна посилатися в шаблоні використовуючи \N, де N – номер групи.
Для того, аби зрозуміти, чим це може бути корисним, давайте розглянемо приклад.
Потрібно знайти рядки в лапках: або в одинарних '...', або в подвійних "..." – обидва варіанти повинні збігатися.
Як їх знайти?
Ми можемо розмістити обидва типи лапок у квадратних дужках: ['"](.*?)['"], але цей вираз знайде рядки зі змішаними лапками, наприклад "...' і '...". Це призведе до неправильних збігів, коли один тип лапок буде в середині інших, наприклад в рядку "Яке твоє ім'я?":
let str = `Він запитав: "Яке твоє ім'я?".`;
let regexp = /['"](.*?)['"]/g;
// Результат не той, який ми б хотіли мати
alert( str.match(regexp) ); // "Яке твоє ім'
Як видно, шаблон знайшов початкову подвійну лапку ", потім текст, включно до наступної одинарної лапки ', опісля чого пошук завершився.
Щоб бути впевненим, що шаблон шукає таку ж кінцеву лапку, як і початкову, можемо обернути початкові лапки в групу захвату і задіяти зворотнє посилання: (['"])(.*?)\1.
Ось правильний код:
let str = `Він запитав: "Яке твоє ім'я?".`;
let regexp = /(['"])(.*?)\1/g;
alert( str.match(regexp) ); // "Яке твоє ім'я?"
Все працює! Механізм регулярних виразів знаходить першу лапку (['"]) та запамʼятовує її. Це перша група захоплення.
Далі в шаблоні \1 означає: “знайти такий же текст, як і в першій групі”, що в нашому випадку – таку ж саму лапку.
Подібно до цього, \2 означало б вміст другої групи, \3 – 3-ї групи, і так далі.
Ми не можемо посилатися на групу, якщо в ній задіяно ?:. Групи, які були виключені із захоплення (?:...), не запамʼятовуються механізмом регулярних виразів.
\1, при заміні: $1У рядку заміни використовується знак долара: $1, а в шаблоні – обернена коса риска \1.
Зворотнє посилання за назвою: \k<імʼя>
Якщо регулярний вираз має багато дужок, досить зручно в такому випадку давати їм імена.
Для посилання на іменовану групу можна використовувати \k<імʼя>.
У наведеному нижче прикладі група з лапками називається ?<quote>, тому звернення до нього буде \k<quote>:
let str = `Він запитав: "Яке твоє ім'я?".`;
let regexp = /(?<quote>['"])(.*?)\k<quote>/g;
alert( str.match(regexp) ); // "Яке твоє ім'я?"
Коментарі
<code>, для кількох рядків – обгорніть їх тегом<pre>, для понад 10 рядків – використовуйте пісочницю (plnkr, jsbin, codepen…)