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

Můžeme použít obsah zachytávacích skupin (...) nejen ve výsledku nebo v náhradním řetězci, ale také v samotném vzoru.

Zpětný odkaz podle čísla:\N

Na skupinu lze ve vzoru odkazovat pomocí \N , kde N je číslo skupiny.

Aby bylo jasné, proč je to užitečné, zvažte úkol.

Potřebujeme najít řetězce v uvozovkách:buď '...' v jednoduchých uvozovkách nebo "..." ve dvojitých uvozovkách – obě varianty by se měly shodovat.

Jak je najít?

Oba druhy uvozovek můžeme umístit do hranatých závorek:['"](.*?)['"] , ale najde řetězce se smíšenými uvozovkami, například "...' a '..." . To by vedlo k nesprávným shodám, pokud by se jedna uvozovka objevila v jiných, například v řetězci "She's the one!" :

let str = `He said: "She's the one!".`;

let regexp = /['"](.*?)['"]/g;

// The result is not what we'd like to have
alert( str.match(regexp) ); // "She'

Jak vidíme, vzor našel úvodní uvozovku " , pak je text spotřebován až do druhé citace ' , čímž se zápas uzavře.

Abychom se ujistili, že vzor hledá závěrečnou uvozovku přesně stejnou jako úvodní, můžeme jej zabalit do zachytávací skupiny a zpětně na něj odkazovat:(['"])(.*?)\1 .

Zde je správný kód:

let str = `He said: "She's the one!".`;

let regexp = /(['"])(.*?)\1/g;

alert( str.match(regexp) ); // "She's the one!"

Teď to funguje! Modul regulárních výrazů najde první uvozovku (['"]) a zapamatuje si jeho obsah. To je první zachycující skupina.

Dále ve vzoru \1 znamená „najít stejný text jako v první skupině“, přesně stejný citát v našem případě.

Podobně jako \2 by znamenalo obsah druhé skupiny, \3 – 3. skupina a tak dále.

Poznámka:

Pokud použijeme ?: ve skupině, pak na to nemůžeme odkazovat. Skupiny, které jsou vyloučeny ze zachycování (?:...) nejsou motorem uloženy do paměti.

Nepleťte se:ve vzoru \1 , v nahrazení:$1

V náhradním řetězci používáme znak dolaru:$1 , zatímco ve vzoru – zpětné lomítko \1 .

Zpětný odkaz podle názvu:\k<name>

Pokud má regulární výraz mnoho závorek, je vhodné je pojmenovat.

K odkazování na pojmenovanou skupinu můžeme použít \k<name> .

V níže uvedeném příkladu se skupina s uvozovkami jmenuje ?<quote> , takže zpětný odkaz je \k<quote> :

let str = `He said: "She's the one!".`;

let regexp = /(?<quote>['"])(.*?)\k<quote>/g;

alert( str.match(regexp) ); // "She's the one!"