RegExp.prototype.exec()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Die Methode exec() von RegExp-Instanzen sucht mit diesem regulären Ausdruck in einer angegebenen Zeichenfolge nach einer Übereinstimmung und gibt ein Ergebnisarray oder null zurück.
Probieren Sie es aus
const regex = /fo+/g;
const str = "table football, foosball";
let array;
while ((array = regex.exec(str)) !== null) {
console.log(`Found ${array[0]}. Next starts at ${regex.lastIndex}.`);
// Expected output: "Found foo. Next starts at 9."
// Expected output: "Found foo. Next starts at 19."
}
Syntax
exec(str)
Parameter
str-
Die Zeichenfolge, mit der der reguläre Ausdruck abgeglichen wird. Alle Werte werden in Zeichenfolgen umgewandelt. Wenn Sie den Parameter weglassen oder
undefinedübergeben, suchtexec()daher nach der Zeichenfolge"undefined", was selten beabsichtigt ist.
Rückgabewert
Wenn keine Übereinstimmung gefunden wird, gibt die Methode exec() null zurück und setzt lastIndex des regulären Ausdrucks auf 0.
Wenn eine Übereinstimmung gefunden wird, gibt die Methode exec() ein Array zurück und aktualisiert die Eigenschaft lastIndex des Objekts für den regulären Ausdruck. Das zurückgegebene Array enthält an erster Stelle den übereinstimmenden Text und danach für jede Capturing Group des übereinstimmenden Texts einen Eintrag. Das Array hat außerdem die folgenden Eigenschaften:
index-
Der nullbasierte Index der Übereinstimmung in der Zeichenfolge.
input-
Die ursprüngliche Zeichenfolge, mit der der Abgleich durchgeführt wurde.
groups-
Ein Objekt mit
nullals Prototyp für benannte Capturing Groups. Seine Schlüssel sind deren Namen und seine Werte die Capturing Groups. Wenn keine benannten Capturing Groups definiert wurden, ist der Wertundefined. Weitere Informationen finden Sie unter Capturing Groups. indicesOptional-
Diese Eigenschaft ist nur vorhanden, wenn das Flag
dgesetzt ist. Sie ist ein Array, dessen Einträge jeweils die Grenzen einer übereinstimmenden Teilzeichenfolge angeben. Der Index jedes Elements in diesem Array entspricht dem Index der jeweiligen übereinstimmenden Teilzeichenfolge im vonexec()zurückgegebenen Array. Der erste Eintrag inindicessteht also für die gesamte Übereinstimmung, der zweite für die erste Capturing Group und so weiter. Jeder Eintrag ist selbst ein Array mit zwei Elementen: Die erste Zahl gibt den Startindex der Übereinstimmung an, die zweite ihren Endindex.Das Array
indiceshat zusätzlich eine Eigenschaftgroups, die ein Objekt mitnullals Prototyp für alle benannten Capturing Groups enthält. Die Schlüssel sind die Namen der Capturing Groups. Jeder Wert ist ein Array mit zwei Elementen, wobei die erste Zahl den Startindex und die zweite Zahl den Endindex der Capturing Group angibt. Wenn der reguläre Ausdruck keine benannten Capturing Groups enthält, istgroupsgleichundefined.
Beschreibung
JavaScript-RegExp-Objekte sind zustandsbehaftet, wenn die Flags global oder sticky gesetzt sind (z. B. /foo/g oder /foo/y). Sie speichern einen lastIndex aus der vorherigen Übereinstimmung. Mithilfe dieses Werts kann exec() mehrere Übereinstimmungen in einer Zeichenfolge durchlaufen (einschließlich Capturing Groups), statt wie String.prototype.match() nur die übereinstimmenden Zeichenfolgen zu liefern.
Bei Verwendung von exec() hat das globale Flag keine Wirkung, wenn das sticky-Flag gesetzt ist – die Suche ist dann immer sticky.
exec() ist die grundlegende Methode für reguläre Ausdrücke. Viele andere Methoden für reguläre Ausdrücke rufen exec() intern auf – darunter auch solche, die von Zeichenfolgenmethoden aufgerufen werden, etwa [Symbol.replace](). Obwohl exec() selbst leistungsfähig (und am effizientesten) ist, macht die Methode die Absicht häufig nicht am deutlichsten.
- Wenn Sie nur wissen möchten, ob der reguläre Ausdruck mit einer Zeichenfolge übereinstimmt, aber nicht, welcher Text übereinstimmt, verwenden Sie stattdessen
RegExp.prototype.test(). - Wenn Sie alle Vorkommen eines globalen regulären Ausdrucks suchen und Informationen wie Capturing Groups nicht benötigen, verwenden Sie stattdessen
String.prototype.match(). Außerdem vereinfachtString.prototype.matchAll()die Suche nach mehreren Teilen einer Zeichenfolge (einschließlich Capturing Groups), da Sie damit über die Übereinstimmungen iterieren können. - Wenn Sie eine Übereinstimmung ausführen, um deren Indexposition in der Zeichenfolge zu ermitteln, verwenden Sie stattdessen die Methode
String.prototype.search().
exec() eignet sich für komplexe Vorgänge, die sich mit den oben genannten Methoden nicht einfach umsetzen lassen, häufig dann, wenn Sie lastIndex manuell anpassen müssen. (String.prototype.matchAll() kopiert den regulären Ausdruck. Wenn Sie lastIndex während der Iteration über matchAll ändern, wirkt sich das daher nicht auf die Iteration aus.) Ein entsprechendes Beispiel finden Sie unter Zurücksetzen von lastIndex.
Beispiele
>exec() verwenden
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" } |
Da dieser reguläre Ausdruck global ist, wird außerdem re.lastIndex auf 25 gesetzt.
Aufeinanderfolgende Übereinstimmungen finden
Wenn Ihr regulärer Ausdruck das Flag g verwendet, können Sie die Methode exec() mehrfach aufrufen, um aufeinanderfolgende Übereinstimmungen in derselben Zeichenfolge zu finden. Dabei beginnt die Suche an der Stelle von str, die durch die Eigenschaft lastIndex des regulären Ausdrucks angegeben wird (auch test() erhöht den Wert der Eigenschaft lastIndex). Beachten Sie, dass die Eigenschaft lastIndex bei der Suche in einer anderen Zeichenfolge nicht zurückgesetzt wird. Die Suche beginnt beim bestehenden Wert von lastIndex.
Nehmen Sie beispielsweise an, Sie hätten 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 gibt den folgenden Text aus:
Found abb. Next match starts at 3 Found ab. Next match starts at 9
Warnung: Es gibt viele Fallstricke, durch die daraus eine Endlosschleife werden kann!
- Platzieren Sie das Literal für den regulären Ausdruck (oder den
RegExp-Konstruktor) nicht innerhalb derwhile-Bedingung. Dadurch wird der reguläre Ausdruck bei jeder Iteration neu erstellt undlastIndexzurückgesetzt. - Stellen Sie sicher, dass das globale Flag (
g) gesetzt ist. Andernfalls wirdlastIndexnie erhöht. - Wenn der reguläre Ausdruck Übereinstimmungen der Länge null finden kann (z. B.
/^/gm), erhöhen SielastIndexjedes Mal manuell, damit die Suche nicht an derselben Stelle hängen bleibt.
In der Regel können Sie solchen Code durch String.prototype.matchAll() ersetzen, um ihn weniger fehleranfällig zu machen.
exec() mit RegExp-Literalen verwenden
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]);
Dadurch wird eine Nachricht ausgegeben, die 'hello world!' enthält.
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp.prototype.exec> |