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 Methode exec() 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

Syntax

js
exec(str)

Parameter

str

Der String, gegen den der reguläre Ausdruck abgeglichen wird. Alle Werte werden zu Strings konvertiert, 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 Methode exec() null zurück und setzt das lastIndex-Regex-Eigenschaft auf 0.

Wenn der Abgleich erfolgreich ist, gibt die Methode exec() 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 Erfassungsgruppe des abgeglichenen Textes. Das Array hat außerdem die folgenden zusätzlichen Eigenschaften:

index

Der nullbasierte Index des Treffers im String.

input

Der Originalstring, gegen den abgeglichen wurde.

groups

Ein null-Prototyp-Objekt von benannten Erfassungsgruppen, dessen Schlüssel die Namen und dessen Werte die Erfassungsgruppen oder undefined sind, 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 Teilstringabgleichs darstellt. Der Index jedes Elements in diesem Array entspricht dem Index des jeweiligen Teilstringabgleichs im Array, das von exec() zurückgegeben wird. Mit anderen Worten, der erste indices-Eintrag repräsentiert den gesamten Treffer, der zweite indices-Eintrag repräsentiert die erste Erfassungsgruppe usw. Jeder Eintrag selbst ist ein Zwei-Elemente-Array, bei dem die erste Zahl den Startindex des Treffers darstellt und die zweite Zahl den Endindex.

Das indices-Array hat zusätzlich eine groups-Eigenschaft, die ein null-Prototyp-Objekt aller benannten Erfassungsgruppen enthält. Die Schlüssel sind die Namen der Erfassungsgruppen und jeder Wert ist ein Zwei-Elemente-Array, bei dem die erste Zahl der Startindex und die zweite Zahl der Endindex der Erfassungsgruppe ist. Wenn der reguläre Ausdruck keine benannten Erfassungsgruppen enthält, ist groups undefined.

Beschreibung

JavaScript-RegExp-Objekte sind zustandsbehaftet, wenn das globale oder sticky-Flag gesetzt ist (z.B. /foo/g oder /foo/y). Sie speichern einen lastIndex vom vorherigen Treffer. Mit dieser Interneigenschaft kann exec() verwendet werden, um über mehrere Treffer in einem String aus Text (mit Erfassungsgruppen) zu iterieren, anstatt nur die übereinstimmenden Strings mit String.prototype.match() zu erhalten.

Beim Verwenden von exec() hat das globale 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 intern exec() auf — einschließlich der Methoden, die von String-Methoden aufgerufen werden, wie [Symbol.replace](). Obwohl exec() selbst leistungsstark (und am effizientesten) ist, vermittelt es oft den Zweck nicht am klarsten.

  • Wenn Sie sich nur darum kümmern, ob der Regex mit einem String übereinstimmt, aber nicht, was tatsächlich abgeglichen wird, verwenden Sie stattdessen RegExp.prototype.test().
  • Wenn Sie alle Vorkommen eines globalen Regex finden und sich nicht um Informationen wie Erfassungsgruppen kümmern, verwenden Sie stattdessen String.prototype.match(). Darüber hinaus hilft String.prototype.matchAll(), das Matching mehrerer Teile eines Strings (mit Erfassungsgruppen) zu vereinfachen, indem Sie über die Treffer iterieren können.
  • Wenn Sie einen Treffer ausführen, um seine Positionsangabe im String zu finden, verwenden Sie stattdessen die Methode String.prototype.search().

Beispiele

Verwenden 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 dem Ausführen 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" }

Außerdem wird re.lastIndex auf 25 gesetzt, da dieser Regex global ist.

Succesive Treffer finden

Wenn Ihr regulärer Ausdruck das g-Flag verwendet, können Sie die exec()-Methode mehrmals verwenden, um aufeinanderfolgende Treffer im selben String zu finden. Wenn Sie dies tun, beginnt die Suche an dem Teilestring von str, der durch die lastIndex-Eigenschaft des regulären Ausdrucks angegeben ist (test() wird auch die lastIndex-Eigenschaft vorantreiben). Beachten Sie, dass die lastIndex-Eigenschaft beim Suchen in einem anderen String nicht zurückgesetzt wird, sondern die Suche an ihrem bestehenden lastIndex beginnen wird.

Angenommen, 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 an:

Found abb. Next match starts at 3
Found ab. Next match starts at 9

Warnung: Es gibt viele Fallstricke, die dazu führen können, dass dies zu einer Endlosschleife wird!

  • Platzieren Sie den Literal-Regex-Ausdruck (oder den RegExp-Konstruktor) nicht innerhalb der while-Bedingung — dies würde den Regex bei jeder Iteration neu erstellen und lastIndex zurücksetzen.
  • Stellen Sie sicher, dass das globale (g) Flag gesetzt ist, sonst wird lastIndex niemals weitergeschaltet.
  • Wenn der Regex möglicherweise Zeichen mit null-Länge erfasst (z.B. /^/gm), erhöhen Sie seinen lastIndex manuell bei jedem Mal, um zu vermeiden, dass Sie an derselben Stelle stecken bleiben.

Sie können diesen Code normalerweise durch String.prototype.matchAll() ersetzen, um ihn weniger fehleranfällig zu machen.

Verwenden von exec() mit RegExp-Literalen

Sie können exec() auch verwenden, ohne explizit ein RegExp-Objekt 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 Language Specification
# sec-regexp.prototype.exec

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch