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 der RegExp
Instanzen führt eine Suche mit diesem regulären Ausdruck nach einem Treffer in einem angegebenen String durch und gibt ein Ergebnisarray zurück oder null
.
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 gematcht werden soll. Alle Werte werden in Strings umgewandelt, 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 exec()
Methode null
zurück und setzt den lastIndex
des Regex auf 0
.
Wenn der Abgleich erfolgreich ist, gibt die exec()
Methode ein Array zurück und aktualisiert die lastIndex
Eigenschaft des regulären Ausdruck-Objekts. Das zurückgegebene Array enthält den gematchten Text als erstes Element und dann ein Element für jede erfasste Gruppe des gematchten Textes. Das Array hat auch die folgenden zusätzlichen Eigenschaften:
index
-
Der 0-basierte Index des Treffers im String.
input
-
Der ursprüngliche String, gegen den gematcht wurde.
groups
-
Ein
null
-Prototyp-Objekt von benannten Erfassungsgruppen, dessen Schlüssel die Namen und Werte die Erfassungsgruppen sind, oderundefined
, wenn keine benannten Erfassungsgruppen definiert wurden. Weitere Informationen finden Sie unter Erfassungsgruppen. indices
Optional-
Diese Eigenschaft ist nur vorhanden, wenn das
d
Flag gesetzt ist. Es ist ein Array, bei dem jeder Eintrag die Grenzen eines Substring-Treffers darstellt. Der Index jedes Elements in diesem Array entspricht dem Index des jeweiligen Substring-Treffers im Array, das vonexec()
zurückgegeben wird. Mit anderen Worten, der ersteindices
Eintrag repräsentiert den gesamten Treffer, der zweiteindices
Eintrag die erste Erfassungsgruppe, usw. Jeder Eintrag selbst ist ein Array mit zwei Elementen, wobei die erste Zahl den Startindex und die zweite Zahl das Endindex des Treffers darstellt.Das
indices
Array hat zudem einegroups
Eigenschaft, die einnull
-Prototyp-Objekt aller benannten Erfassungsgruppen hält. Die Schlüssel sind die Namen der Erfassungsgruppen, und jeder Wert ist ein Array mit zwei Elementen, wobei die erste Zahl den Startindex und die zweite Zahl den Endindex der Erfassungsgruppe darstellt. Wenn der reguläre Ausdruck keine benannten Erfassungsgruppen enthält, istgroups
undefined
.
Beschreibung
JavaScript RegExp
Objekte sind zustandsbehaftet, wenn sie die global oder sticky Flags gesetzt haben (z.B. /foo/g
oder /foo/y
). Sie speichern einen lastIndex
vom vorherigen Treffer. Mithilfe dessen kann exec()
verwendet werden, um über mehrere Treffer in einem Text-String (mit Erfassungsgruppen) zu iterieren, im Gegensatz dazu, nur die übereinstimmenden Strings mit String.prototype.match()
zu bekommen.
Beim Verwenden von exec()
hat das globale Flag keine Wirkung, wenn das Sticky-Flag gesetzt ist — der Match ist immer sticky.
exec()
ist die primitive Methode von Regexps. Viele andere Regexp-Methoden rufen exec()
intern auf — auch jene, die von String-Methoden aufgerufen werden, wie [Symbol.replace]()
. Obwohl exec()
selbst mächtig (und die effizienteste Methode) ist, vermittelt es oft nicht am klarsten die Absicht.
- Wenn Sie nur wissen möchten, ob der Regex einen String trifft, aber nicht, was tatsächlich gematcht 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 es Ihnen ermöglicht, über die Treffer zu iterieren. - Wenn Sie eine Übereinstimmung ausführen, um deren Indexposition im String zu finden, verwenden Sie stattdessen die
String.prototype.search()
Methode.
exec()
ist nützlich für komplexe Operationen, die sich nicht einfach über eine der obigen Methoden erreichen lassen, oft wenn Sie lastIndex
manuell anpassen müssen. (String.prototype.matchAll()
kopiert den Regex, sodass das Ändern von lastIndex
beim Iterieren über matchAll
die Iteration nicht beeinflusst.) Ein solches Beispiel finden Sie bei rewinding 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
auf 25
gesetzt, da dieser Regex global ist.
Aufeinanderfolgende Treffer finden
Wenn Ihr regulärer Ausdruck das g
Flag verwendet, können Sie die exec()
Methode mehrmals verwenden, um aufeinanderfolgende Treffer im gleichen String zu finden. Wenn Sie das tun, beginnt die Suche am Substring von str
, der durch die lastIndex
Eigenschaft des regulären Ausdrucks angegeben ist (lastIndex
(test()
wird auch die lastIndex
Eigenschaft vorantreiben)). Beachten Sie, dass die lastIndex
Eigenschaft nicht zurückgesetzt wird, wenn ein anderer String durchsucht wird, sie startet die Suche an ihrem bestehenden lastIndex
.
Zum Beispiel, nehmen Sie an, 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 Ausdruck Literal (oder den
RegExp
Konstruktor) innerhalb derwhile
Bedingung — er generiert den Regexp für jede Iteration neu und setztlastIndex
zurück. - Stellen Sie sicher, dass das globale (
g
) Flag gesetzt ist, andernfalls wirdlastIndex
niemals vorangetrieben. - Wenn der Regex möglicherweise Zeichen mit Null-Länge trifft (z.B.
/^/gm
), erhöhen Sie seinenlastIndex
manuell jedes Mal, um zu vermeiden, dass Sie an derselben Stelle steckenbleiben.
Normalerweise können Sie diese Art von Code durch String.prototype.matchAll()
ersetzen, um es 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 protokollieren, die 'hello world!'
enthält.
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-regexp.prototype.exec |
Browser-Kompatibilität
Siehe auch
- Reguläre Ausdrücke Leitfaden
RegExp