Start · Sprachen · JavaScript · Referenz · Benannte Rückreferenz: \\k<name>

Benannte Rückreferenz: \\k<name>

Keyword

Verweist innerhalb eines regulären Ausdrucks auf eine vorher definierte benannte Gruppe <code>(?&lt;name&gt;…)</code> und passt genau auf denselben bereits gefundenen Text.

seit JavaScript ES2018 Kategorie: syntax

Signatur

\k&lt;name&gt;

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
Hallo false

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>'));
[ 'ist', 'Test' ] Das ist ein Test mit Fehlern.

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'));
true true false

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>'));
strong Wichtig false

// 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 i wird auch die Rückreferenz ohne Beachtung der Groß-/Kleinschreibung verglichen (/(?<w>a)\k<w>/i passt auf "aA").
  • Syntax-Kompatibilität: Ohne u/v-Flag und ohne benannte Gruppen im Ausdruck wird \k aus Kompatibilitätsgründen als einfaches k gelesen (Annex B). Sobald benannte Gruppen vorkommen oder u gesetzt ist, ist ein \k ohne gültigen Namen ein SyntaxError.
  • Doppelte Gruppennamen sind erst seit ES2025 in getrennten Alternativen erlaubt ((?<j>\d{4})-…|…-(?<j>\d{4})); ältere Engines werfen einen SyntaxError.
  • 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 DOMParser verwenden.