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 in einem angegebenen String durch und gibt ein Ergebnisarray oder null
zurück.
Probieren Sie es aus
const regex1 = RegExp("foo*", "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 zu 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 regulären Ausdrucks auf 0
.
Wenn der Abgleich erfolgreich ist, gibt die exec()
Methode 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 erfasste Gruppe des abgeglichenen Textes. Das Array verfügt außerdem über die folgenden zusätzlichen Eigenschaften:
index
-
Der nullbasierte Index des Abgleichs im String.
input
-
Der ursprüngliche String, gegen den abgeglichen wurde.
groups
-
Ein
null
-Prototype-Objekt von benannten Erfassungsgruppen, deren Schlüssel die Namen und Werte die Erfassungsgruppen sind, oderundefined
, 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 Teilstring-Abgleichs darstellt. Der Index jedes Elements in diesem Array entspricht dem Index des jeweiligen Teilstring-Abgleichs im vonexec()
zurückgegebenen Array. Anders ausgedrückt repräsentiert der ersteindices
-Eintrag den gesamten Abgleich, der zweiteindices
-Eintrag die erste Erfassungsgruppe usw. Jeder Eintrag selbst ist ein Array mit zwei Elementen, wobei die erste Zahl den Startindex des Abgleichs darstellt und die zweite Zahl das Ende des Abgleichs.Das
indices
-Array hat zusätzlich einegroups
Eigenschaft, die einnull
-Prototype-Objekt aller benannten Erfassungsgruppen enthält. Die Schlüssel sind die Namen der Erfassungsgruppen, und jeder Wert ist ein Array mit zwei Elementen, wobei die erste Zahl der Startindex und die zweite Zahl das Ende der Erfassungsgruppe ist. Wenn der reguläre Ausdruck keine benannten Erfassungsgruppen enthält, istgroups
undefined
.
Beschreibung
JavaScript RegExp
Objekte sind zustandsbehaftet, wenn die global oder sticky Flags gesetzt sind (z.B. /foo/g
oder /foo/y
). Sie speichern einen lastIndex
vom vorherigen Abgleich. Intern verwendet, kann exec()
dazu genutzt werden, über mehrere Abgleiche innerhalb eines Textstrings zu iterieren (mit Erfassungsgruppen), im Gegensatz zum Abrufen nur der übereinstimmenden Strings mit String.prototype.match()
.
Beim Verwenden von exec()
hat das Global-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 exec()
intern auf – einschließlich jener, die von String-Methoden aufgerufen werden, wie [Symbol.replace]()
. Während exec()
selbst mächtig ist (und die effizienteste ist), vermittelt sie oft nicht am klarsten die Absicht.
- Wenn Sie nur wissen möchten, ob der Regex mit einem String übereinstimmt, aber nicht, was genau abgestimmt wird, verwenden Sie stattdessen
RegExp.prototype.test()
. - Wenn Sie alle Vorkommen eines globalen Regex finden und Ihnen Informationen wie Erfassungsgruppen egal sind, verwenden Sie stattdessen
String.prototype.match()
. Zusätzlich hilftString.prototype.matchAll()
beim Vereinfachen des Abgleichs mehrerer Teile eines Strings (mit Erfassungsgruppen), indem Sie über die Abgleiche iterieren können. - Wenn Sie einen Abgleich ausführen, um die Indexposition im String zu finden, verwenden Sie stattdessen die
String.prototype.search()
Methode.
exec()
ist nützlich für komplexe Operationen, die nicht einfach über eine der obigen Methoden erreicht werden können, häufig wenn Sie lastIndex
manuell anpassen müssen. (String.prototype.matchAll()
kopiert den Regex, sodass das Ändern von lastIndex
während des Iterierens über matchAll
die Iteration nicht beeinflusst.) Für ein solches Beispiel sehen Sie Zurückspulen des 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 Ausführung 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" } |
Zudem wird re.lastIndex
auf 25
gesetzt, da dieser Regex global ist.
Nachfolgende Übereinstimmungen finden
Wenn Ihr regulärer Ausdruck das g
Flag verwendet, können Sie die exec()
Methode mehrfach verwenden, um nachfolgende Übereinstimmungen im selben String zu finden. Wenn Sie dies tun, beginnt die Suche bei dem Substring von str
, der durch die lastIndex
Eigenschaft des regulären Ausdrucks angegeben wird (test()
wird ebenfalls die lastIndex
Eigenschaft vorantreiben). Beachten Sie, dass die lastIndex
Eigenschaft nicht zurückgesetzt wird, wenn in einem anderen String gesucht wird. Sie beginnt die Suche an ihrem existierenden 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:
Found abb. Next match starts at 3 Found ab. Next match starts at 9
Warnung: Es gibt viele Fallen, die zu einer Endlosschleife führen können!
- Platzieren Sie den regulären Ausdruck Literal (oder den
RegExp
Konstruktor) nicht innerhalb derwhile
-Bedingung — es wird den Regex für jede Iteration neu erstellen undlastIndex
zurücksetzen. - Stellen Sie sicher, dass das globale (
g
) Flag gesetzt ist, oderlastIndex
wird niemals fortgeschritten. - Wenn der Regex möglicherweise Zeichen mit Null-Länge abgleicht (z.B.
/^/gm
), erhöhen Sie manuell seinenlastIndex
jedes Mal, um zu vermeiden, an der gleichen Stelle festzustecken.
Sie können diesen Code normalerweise mit String.prototype.matchAll()
ersetzen, um ihn weniger fehleranfällig zu machen.
exec() mit RegExp-Literalen verwenden
Sie können exec()
auch verwenden, ohne ein RegExp
Objekt explizit 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