Obsah zachytávacích skupin (...) můžeme používat nejen ve výsledku nebo v nahrazovacím řetězci, ale i v samotném vzoru.
Zpětný odkaz podle čísla: \N
Na skupinu se ve vzoru můžeme odkazovat pomocí \N, kde N je číslo skupiny.
Abychom ujasnili, k čemu je to užitečné, uvažujme úlohu.
Potřebujeme najít řetězce v uvozovkách: buď v jednoduchých '...', nebo ve dvojitých "..." – obě varianty by měly vykázat shodu.
Jak je najdeme?
Můžeme vložit oba druhy uvozovek do hranatých závorek: ['"](.*?)['"], ale to by našlo řetězce se smíšenými uvozovkami, např. "...' a '...". To by vedlo k nesprávným shodám, když se jedny uvozovky ocitnou uvnitř druhých, například v řetězci "První mušketýr je d'Artagnan!":
let řetězec = `Řekl: "První mušketýr je d'Artagnan!"`;
let rv = /['"](.*?)['"]/g;
// Výsledkem není to, co bychom chtěli
alert( řetězec.match(rv) ); // "První mušketýr je d'
Jak vidíme, vzor našel otevírací uvozovky " a pak spotřeboval text až do dalších uvozovek ', které shodu uzavírají.
Abychom zajistili, že vzor bude hledat přesně stejné uzavírací uvozovky jako otevírací, můžeme jej vložit do zachytávací skupiny a zpětně se na ni odkázat: (['"])(.*?)\1.
Zde je správný kód:
let řetězec = `Řekl: "První mušketýr je d'Artagnan!"`;
let rv = /(['"])(.*?)\1/g;
alert( řetězec.match(rv) ); // "První mušketýr je d'Artagnan!"
Teď to funguje! Motor regulárních výrazů našel první uvozovky (['"]) a zapamatoval si jejich obsah. To je první zachytávací skupina.
Dále ve vzoru \1 znamená „najít stejný text jako v první skupině“, v našem případě přesně stejné uvozovky.
Podobně by \2 znamenalo obsah druhé skupiny, \3 obsah třetí skupiny a tak dále.
Pokud ve skupině použijeme ?:, nemůžeme se na ni odkazovat. Skupiny, které jsou vyloučeny ze zachytávání (?:...), si motor nepamatuje.
\1, v nahrazovacím řetězci $1V nahrazovacím řetězci používáme znak dolaru: $1, ale ve vzoru zpětné lomítko: \1.
Zpětný odkaz podle jména: \k<jméno>
Jestliže regulární výraz obsahuje mnoho závorek, je vhodné je pojmenovat.
K odkazu na pojmenovanou skupinu můžeme použít \k<jméno>.
V následujícím příkladu se skupina s uvozovkami jmenuje ?<citát>, takže zpětný odkaz je \k<citát>:
let řetězec = `Řekl: "První mušketýr je d'Artagnan!"`;
let rv = /(?<citát>['"])(.*?)\k<citát>/g;
alert( řetězec.match(rv) ); // "První mušketýr je d'Artagnan!"
Komentáře
<code>, pro několik řádků je obalte značkou<pre>, pro více než 10 řádků vložte odkaz na pískoviště (plnkr, jsbin, codepen…)