Erfassungsgruppe: (...)
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Eine Erfassungsgruppe gruppiert ein Teilmuster, sodass Sie einen Quantor auf die gesamte Gruppe anwenden oder Disjunktionen innerhalb davon verwenden können. Sie merkt sich Informationen über das Teilmuster-Match, sodass Sie später mit einem Backreference darauf zurückgreifen oder die Informationen über die Match-Ergebnisse abrufen können.
Wenn Sie das Ergebnis des Teilmuster-Matches nicht benötigen, verwenden Sie stattdessen eine nicht erfassende Gruppe, was die Leistung verbessert und Refactoring-Gefahren vermeidet.
Syntax
(pattern)
Parameter
pattern
-
Ein Muster, das alles enthalten kann, was Sie in einem Regex-Literal verwenden dürfen, einschließlich einer Disjunktion.
Beschreibung
Eine Erfassungsgruppe funktioniert wie der Gruppierungsoperator in JavaScript-Ausdrücken und ermöglicht Ihnen, ein Teilmuster als einzelnes Atom zu verwenden.
Erfassungsgruppen werden in der Reihenfolge ihrer öffnenden Klammern nummeriert. Die erste Erfassungsgruppe wird mit 1
nummeriert, die zweite mit 2
und so weiter. Benannte Erfassungsgruppen sind ebenfalls Erfassungsgruppen und werden zusammen mit anderen (unnamede) Erfassungsgruppen nummeriert. Die Informationen des Erfassungsgruppen-Matches können abgerufen werden durch:
- Den Rückgabewert (der ein Array ist) von
RegExp.prototype.exec()
,String.prototype.match()
undString.prototype.matchAll()
- Die
pN
-Parameter derreplacement
-Callback-Funktion der MethodenString.prototype.replace()
undString.prototype.replaceAll()
- Backreferences innerhalb desselben Musters
Hinweis:
Selbst im Ergebnis-Array von exec()
werden Erfassungsgruppen durch die Nummern 1
, 2
usw. abgerufen, da das 0
-Element das gesamte Match ist. \0
ist kein Backreference, sondern eine Zeichenflucht für das NUL-Zeichen.
Erfassungsgruppen im Regex-Quellcode entsprechen eins-zu-eins ihren Ergebnissen. Wenn eine Erfassungsgruppe nicht gematcht wird (zum Beispiel, wenn sie zu einer nicht passenden Alternative in einer Disjunktion gehört), ist das entsprechende Ergebnis undefined
.
/(ab)|(cd)/.exec("cd"); // ['cd', undefined, 'cd']
Erfassungsgruppen können quantifiziert werden. In diesem Fall sind die Match-Informationen, die dieser Gruppe entsprechen, das letzte Match der Gruppe.
/([ab])+/.exec("abc"); // ['ab', 'b']; because "b" comes after "a", this result overwrites the previous one
Erfassungsgruppen können in Lookahead und Lookbehind Assertionen verwendet werden. Da Lookbehind-Assertionen ihre Atome rückwärts matchen, ist das endgültige Match, das dieser Gruppe entspricht, dasjenige, das am linken Ende des Strings erscheint. Die Indizes der Match-Gruppen entsprechen jedoch immer noch ihren relativen Positionen im Regex-Quellcode.
/c(?=(ab))/.exec("cab"); // ['c', 'ab']
/(?<=(a)(b))c/.exec("abc"); // ['c', 'a', 'b']
/(?<=([ab])+)c/.exec("abc"); // ['c', 'a']; because "a" is seen by the lookbehind after the lookbehind has seen "b"
Erfassungsgruppen können verschachtelt sein, wobei die äußere Gruppe zuerst nummeriert wird und dann die innere Gruppe, da sie durch ihre öffnenden Klammern angeordnet sind. Wenn eine verschachtelte Gruppe durch einen Quantor wiederholt wird, werden jedes Mal, wenn die Gruppe matcht, die Ergebnisse der Untergruppen alle überschrieben, manchmal mit undefined
.
/((a+)?(b+)?(c))*/.exec("aacbbbcac"); // ['aacbbbcac', 'ac', 'a', undefined, 'c']
Im obigen Beispiel wird die äußere Gruppe dreimal gematcht:
- Matcht
"aac"
, mit Untergruppen"aa"
,undefined
und"c"
. - Matcht
"bbbc"
, mit Untergruppenundefined
,"bbb"
und"c"
. - Matcht
"ac"
, mit Untergruppen"a"
,undefined
und"c"
.
Das Ergebnis "bbb"
des zweiten Matches bleibt nicht erhalten, da es durch das dritte Match mit undefined
überschrieben wird.
Sie können die Start- und Endindizes jeder Erfassungsgruppe im Eingabestring erhalten, indem Sie das d
Flag verwenden. Dies erzeugt eine zusätzliche indices
Eigenschaft auf dem Array, das von exec()
zurückgegeben wird.
Sie können optional einer Erfassungsgruppe einen Namen zuweisen, der hilft, Fallstricke in Bezug auf Gruppenpositionen und Indizierung zu vermeiden. Siehe Benannte Erfassungsgruppen für weitere Informationen.
Klammern haben in verschiedenen Regex-Syntaxen andere Zwecke. Zum Beispiel umschließen sie auch Lookahead- und Lookbehind-Assertionen. Da diese Syntaxen alle mit ?
beginnen und ?
ein Quantor ist, der normalerweise nicht direkt nach (
auftreten kann, führt dies nicht zu Mehrdeutigkeiten.
Beispiele
Datum matchen
Das folgende Beispiel matcht ein Datum im Format YYYY-MM-DD
:
function parseDate(input) {
const parts = /^(\d{4})-(\d{2})-(\d{2})$/.exec(input);
if (!parts) {
return null;
}
return parts.slice(1).map((p) => parseInt(p, 10));
}
parseDate("2019-01-01"); // [2019, 1, 1]
parseDate("2019-06-19"); // [2019, 6, 19]
Zitate paaren
Die folgende Funktion matcht die Muster title='xxx'
und title="xxx"
in einem String. Um sicherzustellen, dass die Anführungszeichen übereinstimmen, verwenden wir ein Backreference, um auf das erste Anführungszeichen zu verweisen. Der Zugriff auf die zweite Erfassungsgruppe ([2]
) gibt den String zwischen den übereinstimmenden Anführungszeichen zurück:
function parseTitle(metastring) {
return metastring.match(/title=(["'])(.*?)\1/)[2];
}
parseTitle('title="foo"'); // 'foo'
parseTitle("title='foo' lang='en'"); // 'foo'
parseTitle('title="Named capturing groups\' advantages"'); // "Named capturing groups' advantages"
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # prod-Atom |