Signatur
Beschreibung
Die Methode exec() von RegExp-Instanzen führt mit diesem regulären Ausdruck eine Suche nach einer Übereinstimmung in einem angegebenen String durch und gibt ein Ergebnis-Array oder null zurück.
JavaScript-RegExp-Objekte sind zustandsbehaftet, wenn die Flags global oder sticky gesetzt sind (z. B. /foo/g oder /foo/y). Sie speichern einen lastIndex vom vorherigen Match. Auf dieser Basis kann exec() intern verwendet werden, um über mehrere Übereinstimmungen in einem Text (mit Capture-Gruppen) zu iterieren, im Gegensatz zu String.prototype.match(), das lediglich die passenden Strings liefert.
Bei der Verwendung von exec() hat das global-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 intern exec() auf — einschließlich derer, die von String-Methoden aufgerufen werden, wie [Symbol.replace](). Obwohl exec() selbst mächtig (und am effizientesten) ist, drückt es die Absicht oft nicht am klarsten aus.
- Wenn Sie nur wissen möchten, ob der Regex einen String matcht, aber nicht, was tatsächlich gematcht wird, verwenden Sie stattdessen
RegExp.prototype.test(). - Wenn Sie alle Vorkommen eines globalen Regex finden möchten und Informationen wie Capture-Gruppen nicht benötigen, verwenden Sie stattdessen
String.prototype.match(). Zusätzlich hilftString.prototype.matchAll(), das Matching mehrerer Teile eines Strings (mit Capture-Gruppen) zu vereinfachen, indem Sie über die Matches iterieren können. - Wenn Sie einen Match ausführen, um dessen Indexposition im String zu finden, verwenden Sie stattdessen die Methode
String.prototype.search().
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 während der Iteration über matchAll die Iteration nicht beeinflusst.)
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $str Pflicht | string | — | Der String, gegen den der reguläre Ausdruck gematcht werden soll. Alle Werte werden zu Strings gecoerct, sodass das Weglassen oder das Übergeben von undefined dazu führt, dass exec() nach dem String "undefined" sucht, was selten das gewünschte Verhalten ist. |
Rückgabewert
exec() null zurück und setzt lastIndex des Regex auf 0. Bei Erfolg wird ein Array zurückgegeben und die Eigenschaft lastIndex des Regex-Objekts aktualisiert. Das zurückgegebene Array enthält den gematchten Text als erstes Element und danach ein Element für jede Capture-Gruppe. Zusätzlich hat das Array die Eigenschaften index (0-basierter Index des Matches im String), input (der ursprünglich gematchte String), groups (ein Objekt mit null-Prototyp für benannte Capture-Gruppen oder undefined) und optional indices (nur bei gesetztem d-Flag; Array mit den Bereichsgrenzen jedes Teilstring-Matches, mit einer zusätzlichen groups-Eigenschaft für benannte Gruppen).Beispiele
Verwendung von exec()
// 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");
Aufeinanderfolgende Matches finden
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);
}
Verwendung von exec() mit RegExp-Literalen
const matches = /(hello \S+)/.exec("This is a hello world!");
console.log(matches[1]);
// Wichtig · Fallstricke
Warnung: Es gibt viele Fallstricke, die zu einer Endlosschleife führen können:
- Platzieren Sie das RegExp-Literal (oder den
RegExp-Konstruktor) nicht innerhalb derwhile-Bedingung — es wird bei jeder Iteration neu erzeugt undlastIndexzurückgesetzt. - Stellen Sie sicher, dass das global-Flag (
g) gesetzt ist, sonst wirdlastIndexnie weitergerückt. - Wenn der Regex Zeichen der Länge Null matchen kann (z. B.
/^/gm), erhöhen SielastIndexjedes Mal manuell, um nicht an derselben Stelle stecken zu bleiben.
Diese Art von Code kann normalerweise durch String.prototype.matchAll() ersetzt werden, um ihn weniger fehleranfällig zu machen.