Signatur
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);
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);
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}`);
}
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);
// 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})/. groupskannundefinedsein: Gibt es keinen Treffer, liefertmatch()null– direktes Destrukturieren vonmatch.groupswirft dann einenTypeError. 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. keinhasOwnProperty; stattdessenObject.hasOwn()verwenden. - Benannte Gruppen zählen bei der Nummerierung mit –
$1undmatch[1]funktionieren weiterhin. - In Mustern ohne das Flag
u, die keine benannte Gruppe enthalten, wird\kaus Kompatibilitätsgründen als literaleskinterpretiert. - Kompatibilität: in allen modernen Browsern und Node.js 10+ verfügbar; der Internet Explorer unterstützt die Syntax nicht.