Gruppen und Rückverweise
Gruppen fassen mehrere Muster als Ganzes zusammen, und erfassende Gruppen liefern zusätzliche Teilübereinstimmungsinformationen, wenn ein regulärer Ausdruck verwendet wird, um eine Zeichenkette zu überprüfen. Rückverweise beziehen sich auf eine zuvor erfasste Gruppe im selben regulären Ausdruck.
Probieren Sie es aus
// Groups
const imageDescription = "This image has a resolution of 1440×900 pixels.";
const regexpSize = /([0-9]+)×([0-9]+)/;
const match = imageDescription.match(regexpSize);
console.log(`Width: ${match[1]} / Height: ${match[2]}.`);
// Expected output: "Width: 1440 / Height: 900."
// Backreferences
const findDuplicates = "foo foo bar";
const regex = /\b(\w+)\s+\1\b/g;
console.log(findDuplicates.match(regex));
// Expected output: Array ["foo foo"]
Typen
Zeichen | Bedeutung |
---|---|
(x) |
Erfassende Gruppe:
Passt zu
Ein regulärer Ausdruck kann mehrere erfassende Gruppen enthalten. In den Ergebnissen befinden sich Übereinstimmungen mit erfassenden Gruppen typischerweise in einem Array, dessen Mitglieder in der gleichen Reihenfolge wie die linken Klammern der erfassenden Gruppen geordnet sind. Dies ist normalerweise genau die Reihenfolge der erfassenden Gruppen selbst. Dies wird wichtig, wenn erfassende Gruppen geschachtelt sind. Übereinstimmungen werden mit dem Index der Elemente des Ergebnisses ( Erfassende Gruppen haben einen Leistungseinbruch. Wenn Sie das erfasste Teilmuster nicht speichern müssen, sollten Sie bevorzugt nicht-erfassende Klammern verwenden (siehe unten).
|
(?<Name>x) |
Benannte erfassende Gruppe:
Passt zu "x" und speichert es in der Eigenschaft
Zum Beispiel, um die Vorwahl der Vereinigten Staaten aus einer Telefonnummer zu extrahieren, könnten wir |
(?:x) |
Nicht-erfassende Gruppe:
Passt zu "x", speichert die Übereinstimmung aber nicht. Das übereinstimmende Teilmuster kann weder aus den Elementen des Ergebnisarrays ( |
(?flags:x) , (?:flags-flags:x) |
Modifikator:
Aktiviert oder deaktiviert die angegebenen Flags nur für das umschlossene Muster. Nur die Flags |
\n
|
Rückverweis:
Dabei ist "n" eine positive ganze Zahl. Passt zum gleichen Teilstring wie die n-te erfassende Gruppe im regulären Ausdruck (zählt die linken Klammern). Zum Beispiel passt |
\k<Name> |
Benannter Rückverweis:
Ein Rückverweis auf den zuletzt mit der benannten erfassenden Gruppe übereinstimmenden Teilstring, der mit
Zum Beispiel,
Hinweis: |
Beispiele
Verwendung von Gruppen
In diesem Beispiel werden zwei Wörter in einem strukturierten Format durch Verwendung von erfassenden Gruppen zusammengeführt. \w+
passt zu einem oder mehreren Wortzeichen, und die Klammern ()
erstellen eine erfassende Gruppe. Das g
-Flag wird verwendet, um alle Vorkommen zu erfassen.
const personList = `First_Name: John, Last_Name: Doe
First_Name: Jane, Last_Name: Smith`;
const regexpNames = /First_Name: (\w+), Last_Name: (\w+)/g;
for (const match of personList.matchAll(regexpNames)) {
console.log(`Hello ${match[1]} ${match[2]}`);
}
Weitere Beispiele finden Sie in der Referenz zur erfassenden Gruppe.
Verwendung von benannten Gruppen
Dieses Beispiel ist dasselbe wie oben, aber wir verwenden benannte erfassende Gruppen, um die passenden Wörter anhand ihrer Bedeutung zugänglich zu machen.
const personList = `First_Name: John, Last_Name: Doe
First_Name: Jane, Last_Name: Smith`;
const regexpNames =
/First_Name: (?<firstName>\w+), Last_Name: (?<lastName>\w+)/g;
for (const match of personList.matchAll(regexpNames)) {
console.log(`Hello ${match.groups.firstName} ${match.groups.lastName}`);
}
Weitere Beispiele finden Sie in der Referenz zur benannten erfassenden Gruppe.
Verwendung von Gruppen und Rückverweisen
In diesem Beispiel wird zuerst ein einzelnes oder doppeltes Anführungszeichen mit ['"]
abgeglichen, es wird gespeichert, eine beliebige Anzahl von Zeichen mit .*?
abgeglichen (*?
ist ein nicht-gieriger Quantor), bis das gespeicherte Anführungszeichen erneut mit \1
abgeglichen wird. Das \1
ist ein Rückverweis auf die erste erfassende Gruppe, der den gleichen Typ von Anführungszeichen abgleicht. Das Ergebnis sind daher zwei Strings: "'"
und '"'
.
const quote = `Single quote "'" and double quote '"'`;
const regexpQuotes = /(['"]).*?\1/g;
for (const match of quote.matchAll(regexpQuotes)) {
console.log(match[0]);
}
Weitere Beispiele finden Sie in der Referenz zum Rückverweis.
Verwendung von Gruppen und Übereinstimmungsindizes
Durch Angabe des d
-Flags werden die Indizes jeder erfassenden Gruppe zurückgegeben. Dies ist besonders nützlich, wenn Sie jede erfasste Gruppe mit dem ursprünglichen Text abgleichen möchten – beispielsweise, um Compiler-Diagnosen bereitzustellen.
const code = `function add(x, y) {
return x + y;
}`;
const functionRegexp =
/(function\s+)(?<name>[$_\p{ID_Start}][$\p{ID_Continue}]*)/du;
const match = functionRegexp.exec(code);
const lines = code.split("\n");
lines.splice(
1,
0,
" ".repeat(match.indices[1][1] - match.indices[1][0]) +
"^".repeat(match.indices.groups.name[1] - match.indices.groups.name[0]),
);
console.log(lines.join("\n"));
// function add(x, y) {
// ^^^
// return x + y;
// }
Siehe auch
- Reguläre Ausdrücke Leitfaden
- Zeichenklassen Leitfaden
- Assertions Leitfaden
- Quantoren Leitfaden
RegExp
- Reguläre Ausdrücke Referenz
- Rückverweis:
\1
,\2
- Erfassende Gruppe:
(...)
- Benannter Rückverweis:
\k<name>
- Benannte erfassende Gruppe:
(?<name>...)
- Nicht-erfassende Gruppe:
(?:...)