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 exec()
-Methode von RegExp
-Instanzen führt eine Suche mit diesem regulären Ausdruck nach einem Treffer in einem angegebenen String aus und gibt ein Ergebnisarray oder null
zurück.
Probieren Sie es aus
const regex1 = /fo+/g;
const str1 = "table football, foosball";
let array1;
while ((array1 = regex1.exec(str1)) !== null) {
console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
// Expected output: "Found foo. Next starts at 9."
// Expected output: "Found foo. Next starts at 19."
}
Syntax
exec(str)
Parameter
str
-
Der String, gegen den der reguläre Ausdruck abgeglichen werden soll. Alle Werte werden in Strings umgewandelt, sodass das Weglassen des Werts oder das Übergeben von
undefined
dazu führt, 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 den lastIndex
des regulären Ausdrucks 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 jeweils ein Element für jede Erfassungsgruppe des abgeglichenen Textes. Das Array hat außerdem die folgenden zusätzlichen Eigenschaften:
index
-
Der 0-basierte Index des Treffers im String.
input
-
Der ursprüngliche String, gegen den abgeglichen wurde.
groups
-
Ein null-Prototyp-Objekt von benannten Erfassungsgruppen, deren Schlüssel die Namen und deren Werte die Erfassungsgruppen oder
undefined
sind, falls 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, in dem jeder Eintrag die Grenzen eines Teilstring-Treffers repräsentiert. Der Index jedes Elements in diesem Array entspricht dem Index des jeweiligen Teilstring-Treffers im vonexec()
zurückgegebenen Array. 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 Zweielemente-Array, wobei die erste Zahl den Startindex des Treffers und die zweite Zahl dessen Endindex darstellt.Das
indices
-Array hat zusätzlich einegroups
-Eigenschaft, die ein null-Prototyp-Objekt aller benannten Erfassungsgruppen enthält. Die Schlüssel sind die Namen der Erfassungsgruppen und jeder Wert ist ein Zweielemente-Array, wobei 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 gültige oder das sticky-Flag gesetzt ist (z.B. /foo/g
oder /foo/y
). Sie speichern einen lastIndex
vom vorherigen Treffer. Unter Verwendung dessen kann exec()
verwendet werden, um über mehrere Treffer in einem Textstring zu iterieren (mit Erfassungsgruppen), anstatt nur die passenden Strings mit String.prototype.match()
zu erhalten.
Bei der Verwendung von exec()
hat das globale Flag keine Auswirkungen, wenn das sticky-Flag gesetzt ist — der Abgleich ist immer sticky.
exec()
ist die primitive Methode von Regexps. Viele andere Regexpmethoden rufen intern exec()
auf — einschließlich derer, die von Stringmethoden aufgerufen werden, wie [Symbol.replace]()
. Während exec()
selbst mächtig ist (und die effizienteste ist), vermittelt es oft nicht die Absicht am klarsten.
- Wenn Sie nur wissen möchten, ob der Regex einen String trifft, aber nicht, was tatsächlich getroffen wird, verwenden Sie stattdessen
RegExp.prototype.test()
. - Wenn Sie alle Vorkommen eines globalen Regexps finden und Informationen wie Erfassungsgruppen nicht benötigen, verwenden Sie stattdessen
String.prototype.match()
. Darüber hinaus hilft IhnenString.prototype.matchAll()
, mehrere Teile eines Strings (mit Erfassungsgruppen) zu finden, indem Sie über die Treffer iterieren können. - Wenn Sie einen Treffer ausführen, um seine Indexposition im String zu finden, verwenden Sie stattdessen die Methode
String.prototype.search()
.
exec()
ist nützlich für komplexe Operationen, die nicht leicht durch eine der oben genannten Methoden erreicht werden können, oft wenn Sie den lastIndex
manuell anpassen müssen. (String.prototype.matchAll()
kopiert den Regex, sodass das Ändern von lastIndex
beim Iterieren über matchAll
die Iteration nicht beeinflusst.) Für ein solches Beispiel siehe das Zurücksetzen von lastIndex
.
Beispiele
Verwendung 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" } |
Zusätzlich wird re.lastIndex
aufgrund dieses globalen Regexps auf 25
gesetzt.
Aufeinanderfolgende Treffer finden
Wenn Ihr regulärer Ausdruck das g
-Flag verwendet, können Sie die Methode exec()
mehrmals verwenden, um aufeinanderfolgende Treffer im selben String zu finden. Bei der Anwendung beginnt die Suche beim Teilstring von str
, der von der lastIndex
-Eigenschaft des regulären Ausdrucks angegeben wird (test()
wird auch die lastIndex
-Eigenschaft weiterführen). Beachten Sie, dass die lastIndex
-Eigenschaft nicht zurückgesetzt wird, wenn nach einem anderen String gesucht wird, sie beginnt ihre Suche beim vorhandenen lastIndex
.
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 nicht den regulären Ausdruckliteral (oder den
RegExp
-Konstruktor) innerhalb derwhile
-Bedingung — es wird den Regex bei jeder Iteration neu erstellen undlastIndex
zurücksetzen. - Stellen Sie sicher, dass das globale (
g
) Flag gesetzt ist, oderlastIndex
wird nie weitergeführt. - Wenn der Regex möglicherweise Zeichen mit Null-Länge abgleichen könnte (z.B.,
/^/gm
), erhöhen Sie dessenlastIndex
manuell jedes Mal, um zu vermeiden, dass er festhängt.
Sie können normalerweise diesen Code durch String.prototype.matchAll()
ersetzen, um ihn weniger fehleranfällig zu machen.
Verwendung 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® 2026 Language Specification # sec-regexp.prototype.exec |
Browser-Kompatibilität
Siehe auch
- Reguläre Ausdrücke Leitfaden
RegExp