RegExp.prototype.exec()
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.
Die Methode exec()
von RegExp
-Instanzen führt eine Suche mit diesem regulären Ausdruck in einem angegebenen String durch und gibt ein Ergebnisarray oder null
zurück.
Probieren Sie es aus
Syntax
exec(str)
Parameter
str
-
Der String, gegen den der reguläre Ausdruck abgeglichen wird. Alle Werte werden zu Strings konvertiert, daher führt das Weglassen oder Übergeben von
undefined
dazu, dassexec()
nach dem String"undefined"
sucht, was selten gewünscht ist.
Rückgabewert
Wenn der Abgleich fehlschlägt, gibt die Methode exec()
null
zurück und setzt das lastIndex
-Regex-Eigenschaft auf 0
.
Wenn der Abgleich erfolgreich ist, gibt die Methode exec()
ein Array zurück und aktualisiert die lastIndex
-Eigenschaft des regulären Ausdrucksobjekts. Das zurückgegebene Array enthält den abgeglichenen Text als erstes Element und dann ein Element für jede Erfassungsgruppe des abgeglichenen Textes. Das Array hat außerdem die folgenden zusätzlichen Eigenschaften:
index
-
Der nullbasierte Index des Treffers im String.
input
-
Der Originalstring, gegen den abgeglichen wurde.
groups
-
Ein
null
-Prototyp-Objekt von benannten Erfassungsgruppen, dessen Schlüssel die Namen und dessen Werte die Erfassungsgruppen oderundefined
sind, wenn keine benannten Erfassungsgruppen definiert wurden. Siehe Erfassungsgruppen für weitere Informationen. indices
Optional-
Diese Eigenschaft ist nur vorhanden, wenn das
d
-Flag gesetzt ist. Es ist ein Array, bei dem jeder Eintrag die Grenzen eines Teilstringabgleichs darstellt. Der Index jedes Elements in diesem Array entspricht dem Index des jeweiligen Teilstringabgleichs im Array, das vonexec()
zurückgegeben wird. Mit anderen Worten, der ersteindices
-Eintrag repräsentiert den gesamten Treffer, der zweiteindices
-Eintrag repräsentiert die erste Erfassungsgruppe usw. Jeder Eintrag selbst ist ein Zwei-Elemente-Array, bei dem die erste Zahl den Startindex des Treffers darstellt und die zweite Zahl den Endindex.Das
indices
-Array hat zusätzlich einegroups
-Eigenschaft, die einnull
-Prototyp-Objekt aller benannten Erfassungsgruppen enthält. Die Schlüssel sind die Namen der Erfassungsgruppen und jeder Wert ist ein Zwei-Elemente-Array, bei dem die erste Zahl der Startindex und die zweite Zahl der Endindex der Erfassungsgruppe ist. Wenn der reguläre Ausdruck keine benannten Erfassungsgruppen enthält, istgroups
undefined
.
Beschreibung
JavaScript-RegExp
-Objekte sind zustandsbehaftet, wenn das globale oder sticky-Flag gesetzt ist (z.B. /foo/g
oder /foo/y
). Sie speichern einen lastIndex
vom vorherigen Treffer. Mit dieser Interneigenschaft kann exec()
verwendet werden, um über mehrere Treffer in einem String aus Text (mit Erfassungsgruppen) zu iterieren, anstatt nur die übereinstimmenden Strings mit String.prototype.match()
zu erhalten.
Beim Verwenden von exec()
hat das globale Flag keine Wirkung, wenn das Sticky-Flag gesetzt ist – der Abgleich ist immer sticky.
exec()
ist die primitive Methode von Regexps. Viele andere Regexp-Methoden rufen intern exec()
auf — einschließlich der Methoden, die von String-Methoden aufgerufen werden, wie [Symbol.replace]()
. Obwohl exec()
selbst leistungsstark (und am effizientesten) ist, vermittelt es oft den Zweck nicht am klarsten.
- Wenn Sie sich nur darum kümmern, ob der Regex mit einem String übereinstimmt, aber nicht, was tatsächlich abgeglichen wird, verwenden Sie stattdessen
RegExp.prototype.test()
. - Wenn Sie alle Vorkommen eines globalen Regex finden und sich nicht um Informationen wie Erfassungsgruppen kümmern, verwenden Sie stattdessen
String.prototype.match()
. Darüber hinaus hilftString.prototype.matchAll()
, das Matching mehrerer Teile eines Strings (mit Erfassungsgruppen) zu vereinfachen, indem Sie über die Treffer iterieren können. - Wenn Sie einen Treffer ausführen, um seine Positionsangabe im String zu finden, verwenden Sie stattdessen die Methode
String.prototype.search()
.
Beispiele
Verwenden von exec()
Betrachten Sie das folgende Beispiel:
// Match "quick brown" followed by "jumps", ignoring characters in between
// Remember "brown" and "jumps"
// Ignore case
const re = /quick\s(?<color>brown).+?(jumps)/dgi;
const result = re.exec("The Quick Brown Fox Jumps Over The Lazy Dog");
Die folgende Tabelle zeigt den Zustand von result
nach dem Ausführen dieses Skripts:
Eigenschaft | Wert |
---|---|
[0] |
"Quick Brown Fox Jumps" |
[1] |
"Brown" |
[2] |
"Jumps" |
index |
4 |
indices |
[[4, 25], [10, 15], [20, 25]] groups: { color: [10, 15 ]} |
input |
"The Quick Brown Fox Jumps Over The Lazy Dog" |
groups |
{ color: "brown" } |
Außerdem wird re.lastIndex
auf 25
gesetzt, da dieser Regex global ist.
Succesive Treffer finden
Wenn Ihr regulärer Ausdruck das g
-Flag verwendet, können Sie die exec()
-Methode mehrmals verwenden, um aufeinanderfolgende Treffer im selben String zu finden. Wenn Sie dies tun, beginnt die Suche an dem Teilestring von str
, der durch die lastIndex
-Eigenschaft des regulären Ausdrucks angegeben ist (test()
wird auch die lastIndex
-Eigenschaft vorantreiben). Beachten Sie, dass die lastIndex
-Eigenschaft beim Suchen in einem anderen String nicht zurückgesetzt wird, sondern die Suche an ihrem bestehenden lastIndex
beginnen wird.
Angenommen, Sie haben dieses Skript:
const myRe = /ab*/g;
const str = "abbcdefabh";
let myArray;
while ((myArray = myRe.exec(str)) !== null) {
let msg = `Found ${myArray[0]}. `;
msg += `Next match starts at ${myRe.lastIndex}`;
console.log(msg);
}
Dieses Skript zeigt den folgenden Text an:
Found abb. Next match starts at 3 Found ab. Next match starts at 9
Warnung: Es gibt viele Fallstricke, die dazu führen können, dass dies zu einer Endlosschleife wird!
- Platzieren Sie den Literal-Regex-Ausdruck (oder den
RegExp
-Konstruktor) nicht innerhalb derwhile
-Bedingung — dies würde den Regex bei jeder Iteration neu erstellen undlastIndex
zurücksetzen. - Stellen Sie sicher, dass das globale (
g
) Flag gesetzt ist, sonst wirdlastIndex
niemals weitergeschaltet. - Wenn der Regex möglicherweise Zeichen mit null-Länge erfasst (z.B.
/^/gm
), erhöhen Sie seinenlastIndex
manuell bei jedem Mal, um zu vermeiden, dass Sie an derselben Stelle stecken bleiben.
Sie können diesen Code normalerweise durch String.prototype.matchAll()
ersetzen, um ihn weniger fehleranfällig zu machen.
Verwenden von exec() mit RegExp-Literalen
Sie können exec()
auch verwenden, ohne explizit ein RegExp
-Objekt zu erstellen:
const matches = /(hello \S+)/.exec("This is a hello world!");
console.log(matches[1]);
Dies wird eine Nachricht mit 'hello world!'
protokollieren.
Spezifikationen
Specification |
---|
ECMAScript Language Specification # sec-regexp.prototype.exec |
Browser-Kompatibilität
BCD tables only load in the browser