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â¦)