Signatur
Beschreibung
Eine benannte Rückreferenz \k<name> steht in einem regulären Ausdruck für den Text, den die benannte Erfassungsgruppe (?<name>…) bereits gefunden hat. Sie wiederholt also nicht das Muster der Gruppe, sondern genau den tatsächlich gefundenen Text. Sie funktioniert wie die nummerierte Rückreferenz \1, \2 usw., spricht die Gruppe aber über ihren Namen an. Dadurch sind komplexe Muster besser lesbar und brechen nicht, wenn man weitere Gruppen einfügt.
Typische Einsatzfälle sind passende Paare von Anführungszeichen ('…' oder "…"), sich wiederholende Wörter, zueinander passende HTML-/XML-Tags oder Trennzeichen, die an mehreren Stellen gleich sein müssen (z. B. 2024-05-01 gegenüber 2024/05/01).
Die Rückreferenz darf vor oder nach der Gruppe stehen. Wurde die Gruppe an der Stelle aber noch nicht oder überhaupt nicht erfasst, passt \k<name> auf den leeren String, der Vergleich scheitert also nicht. Das Gegenstück in Ersetzungs-Strings von String.prototype.replace() ist $<name>, nicht \k<name>.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name Pflicht | Bezeichner (Identifier) | Name einer im selben regulären Ausdruck definierten benannten Gruppe (?<name>…). Muss ein gültiger JavaScript-Bezeichner sein. Existiert die Gruppe nicht, wirft der Ausdruck einen SyntaxError. |
Beispiele
Passende Anführungszeichen erkennen
const re = /(?<quote>['"])(?<text>.*?)\k<quote>/;
console.log(re.exec(`Er sagte "Hallo" laut`).groups.text);
console.log(re.test(`'gemischt"`)); // öffnendes und schließendes Zeichen verschieden
Doppelte Wörter im Text finden
const doppelt = /\b(?<wort>\w+)\s+\k<wort>\b/gi;
const text = 'Das ist ist ein Test Test mit Fehlern.';
const treffer = [...text.matchAll(doppelt)].map((m) => m.groups.wort);
console.log(treffer);
// Korrektur mit $<name> im Ersetzungs-String
console.log(text.replace(doppelt, '$<wort>'));
Datum mit einheitlichem Trennzeichen validieren
const datum = /^(?<j>\d{4})(?<sep>[-/.])(?<m>\d{2})\k<sep>(?<t>\d{2})$/;
const pruefe = (s) => datum.test(s);
console.log(pruefe('2024-05-01'));
console.log(pruefe('2024/05/01'));
console.log(pruefe('2024-05/01'));
Einfache passende HTML-Tags
const tag = /<(?<name>[a-z][a-z0-9]*)>(?<inhalt>[^<]*)<\/\k<name>>/i;
const m = '<strong>Wichtig</strong>'.match(tag);
console.log(m.groups.name, m.groups.inhalt);
console.log(tag.test('<b>falsch</i>'));
// Wichtig · Fallstricke
- Text, nicht Muster:
\k<name>wiederholt den gefundenen Text. Wer das Muster erneut anwenden will, muss es ausschreiben (JavaScript hat keine Unterausdruck-Aufrufe wie(?&name)in PCRE). - Nicht erfasste Gruppen: Steht die Rückreferenz vor der Gruppe oder in einem nicht genommenen Zweig einer Alternative, passt sie auf den leeren String. Das kann zu unerwarteten Treffern führen.
- Groß-/Kleinschreibung: Mit dem Flag
iwird auch die Rückreferenz ohne Beachtung der Groß-/Kleinschreibung verglichen (/(?<w>a)\k<w>/ipasst auf"aA"). - Syntax-Kompatibilität: Ohne
u/v-Flag und ohne benannte Gruppen im Ausdruck wird\kaus Kompatibilitätsgründen als einfacheskgelesen (Annex B). Sobald benannte Gruppen vorkommen oderugesetzt ist, ist ein\kohne gültigen Namen einSyntaxError. - Doppelte Gruppennamen sind erst seit ES2025 in getrennten Alternativen erlaubt (
(?<j>\d{4})-…|…-(?<j>\d{4})); ältere Engines werfen einenSyntaxError. - Ersetzungs-Strings: In
replace()wird$<name>verwendet, nicht\k<name>. - Kompatibilität: Unterstützt in allen aktuellen Browsern und in Node.js 10+. Sehr alte Engines (z. B. IE, Safari < 11.1) kennen keine benannten Gruppen.
- Performance: Rückreferenzen verhindern bestimmte Optimierungen und können zusammen mit verschachtelten Quantoren katastrophales Backtracking (ReDoS) begünstigen. Vorsicht bei Eingaben von Benutzern.
- HTML sollte man nicht zuverlässig mit regulären Ausdrücken zerlegen; dafür besser
DOMParserverwenden.