Start · Sprachen · JavaScript · Referenz · Benannte Erfassungsgruppe: (?<name>...)

Benannte Erfassungsgruppe: (?<name>...)

Keyword

Eine benannte Erfassungsgruppe <code>(?&lt;name&gt;...)</code> speichert den gefundenen Teiltext unter einem Namen, der über <code>match.groups.name</code> abrufbar ist.

seit JavaScript ES2018 Kategorie: syntax

Signatur

/(?<name>pattern)/

Beschreibung

Eine benannte Erfassungsgruppe funktioniert wie eine normale Erfassungsgruppe (...), bekommt aber zusätzlich einen Bezeichner. Den gefundenen Teiltext kann man danach nicht nur über den Index (match[1]), sondern auch über den Namen im Objekt match.groups abrufen. Das macht reguläre Ausdrücke deutlich lesbarer und robuster: Fügt man später weitere Gruppen hinzu, verschieben sich zwar die Indizes, die Namen bleiben aber gleich.

Innerhalb desselben Musters kann man mit der benannten Rückreferenz \k<name> auf den bereits gefundenen Text zurückgreifen. In Ersetzungszeichenketten von String.prototype.replace() und replaceAll() steht dafür $<name> zur Verfügung. Bei einer Ersetzungsfunktion wird das groups-Objekt als letztes Argument übergeben.

Benannte Gruppen eignen sich besonders zum Zerlegen strukturierter Zeichenketten wie Datumsangaben, URLs, Logzeilen oder Versionsnummern. In Kombination mit Destrukturierung (const { year, month } = match.groups) entsteht sehr kompakter, selbsterklärender Code.

Parameter

Name Typ Default Beschreibung
$name Pflicht Bezeichner Name der Gruppe. Muss ein gültiger JavaScript-Bezeichner sein (z. B. year, _id, $wert); darf nicht mit einer Ziffer beginnen und keinen Bindestrich enthalten.
$pattern Pflicht RegExp-Teilmuster Das Teilmuster, dessen Treffer unter name gespeichert wird. Kann weitere (auch benannte) Gruppen enthalten.

Beispiele

Datum zerlegen mit Destrukturierung

const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const match = '2024-03-15'.match(re);

const { year, month, day } = match.groups;
console.log(year, month, day);
console.log(match[1] === match.groups.year);
2024 03 15 true

Datumsformat umstellen mit $<name>

const iso = 'Termin: 2024-03-15, Abgabe: 2024-04-01';
const deutsch = iso.replace(
  /(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/g,
  '$<d>.$<m>.$<y>'
);
console.log(deutsch);
Termin: 15.03.2024, Abgabe: 01.04.2024

Benannte Rückreferenz \k<name> für doppelte Wörter

const re = /\b(?<wort>\w+)\s+\k<wort>\b/gi;
const text = 'Das ist ist ein Test Test.';

for (const m of text.matchAll(re)) {
  console.log(`Doppelt: "${m.groups.wort}" an Position ${m.index}`);
}
Doppelt: "ist" an Position 4 Doppelt: "Test" an Position 16

Logzeilen parsen mit Ersetzungsfunktion

const log = '[ERROR] 12:04:33 Datenbank nicht erreichbar';
const re = /^\[(?<level>\w+)\] (?<time>[\d:]+) (?<msg>.+)$/;

const formatiert = log.replace(re, (...args) => {
  const { level, time, msg } = args.at(-1); // groups ist das letzte Argument
  return `${time} | ${level.toLowerCase()} | ${msg}`;
});
console.log(formatiert);
12:04:33 | error | Datenbank nicht erreichbar

// Wichtig · Fallstricke

  • Doppelte Namen: Ein Name darf in einem Muster grundsätzlich nur einmal vorkommen, sonst gibt es einen SyntaxError. Seit ES2025 (Chrome 125, Firefox 129, Safari 17) sind doppelte Namen erlaubt, sofern sie in verschiedenen Alternativen stehen, z. B. /(?<y>\d{4})-\d\d|\d\d\/(?<y>\d{4})/.
  • groups kann undefined sein: Gibt es keinen Treffer, liefert match() null – direktes Destrukturieren von match.groups wirft dann einen TypeError. Prüfen oder Optional Chaining verwenden: str.match(re)?.groups.
  • Das groups-Objekt hat keinen Prototyp (Object.create(null)), daher gibt es darauf z. B. kein hasOwnProperty; stattdessen Object.hasOwn() verwenden.
  • Benannte Gruppen zählen bei der Nummerierung mit – $1 und match[1] funktionieren weiterhin.
  • In Mustern ohne das Flag u, die keine benannte Gruppe enthalten, wird \k aus Kompatibilitätsgründen als literales k interpretiert.
  • Kompatibilität: in allen modernen Browsern und Node.js 10+ verfügbar; der Internet Explorer unterstützt die Syntax nicht.