12. června 2026

Zpětné odkazy ve vzoru: \N a \k<jméno>

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.

Poznámka:

Pokud ve skupině použijeme ?:, nemůžeme se na ni odkazovat. Skupiny, které jsou vyloučeny ze zachytávání (?:...), si motor nepamatuje.

Nepleťte si to: ve vzoru \1, v nahrazovacím řetězci $1

V 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!"
Mapa tutoriálu

Komentáře

přečtěte si před komentováním…
  • Máte-li návrhy na zlepšení, vytvořte prosím issue na GitHubu nebo pull request místo komentáře.
  • Pokud v článku něčemu nerozumíte, napište prosím, čemu přesně a na kterém místě.
  • Pro vložení několika slov kódu použijte značku <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…)