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

js
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, dass exec() 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, oder undefined, 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 von exec() zurückgegebenen Array. Anders ausgedrückt repräsentiert der erste indices-Eintrag den gesamten Abgleich, der zweite indices-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 eine groups Eigenschaft, die ein null-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, ist groups 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 hilft String.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:

js
// 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:

js
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 der while-Bedingung — es wird den Regex für jede Iteration neu erstellen und lastIndex zurücksetzen.
  • Stellen Sie sicher, dass das globale (g) Flag gesetzt ist, oder lastIndex wird niemals fortgeschritten.
  • Wenn der Regex möglicherweise Zeichen mit Null-Länge abgleicht (z.B. /^/gm), erhöhen Sie manuell seinen lastIndex 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:

js
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