Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

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

js
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, sucht exec() 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 null als 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 Wert undefined. Weitere Informationen finden Sie unter Capturing Groups.

indices Optional

Diese Eigenschaft ist nur vorhanden, wenn das Flag d gesetzt 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 von exec() zurückgegebenen Array. Der erste Eintrag in indices steht 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 indices hat zusätzlich eine Eigenschaft groups, die ein Objekt mit null als 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, ist groups gleich undefined.

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 vereinfacht String.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:

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" }

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:

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 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 der while-Bedingung. Dadurch wird der reguläre Ausdruck bei jeder Iteration neu erstellt und lastIndex zurückgesetzt.
  • Stellen Sie sicher, dass das globale Flag (g) gesetzt ist. Andernfalls wird lastIndex nie erhöht.
  • Wenn der reguläre Ausdruck Übereinstimmungen der Länge null finden kann (z. B. /^/gm), erhöhen Sie lastIndex jedes 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:

js
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

Browser-Kompatibilität

Siehe auch