Start · Sprachen · JavaScript · Referenz · RegExp.prototype.exec()

RegExp.prototype.exec()

Methode

Die Methode <code>exec()</code> führt eine Suche mit dem regulären Ausdruck in einem String aus und gibt ein Ergebnis-Array oder <code>null</code> zurück.

Kategorie: method-property

Signatur

exec(str)

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 hilft String.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

Typ
Array | null
Beschreibung
Wenn der Match fehlschlägt, gibt die Methode 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);
}
Found abb. Next match starts at 3 Found ab. Next match starts at 9

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 der while-Bedingung — es wird bei jeder Iteration neu erzeugt und lastIndex zurückgesetzt.
  • Stellen Sie sicher, dass das global-Flag (g) gesetzt ist, sonst wird lastIndex nie weitergerückt.
  • Wenn der Regex Zeichen der Länge Null matchen kann (z. B. /^/gm), erhöhen Sie lastIndex jedes 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.