Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
String.prototype.matchAll()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Januar 2020.
DiematchAll()-Methode vonString-Werten gibt einen Iterator für alle Ergebnisse zurück, die dieser Zeichenkette mit einemregulären Ausdruck entsprechen, einschließlichCapturing-Gruppen.
In diesem Artikel
Probieren Sie es aus
const regexp = /t(e)(st(\d?))/g;const str = "test1test2";const array = [...str.matchAll(regexp)];console.log(array[0]);// Expected output: Array ["test1", "e", "st1", "1"]console.log(array[1]);// Expected output: Array ["test2", "e", "st2", "2"]Syntax
matchAll(regexp)Parameter
regexpEin reguläres Ausdrucksobjekt oder ein beliebiges Objekt, das eine
Symbol.matchAll-Methode hat.Wenn
regexpkeinRegExp-Objekt ist und keineSymbol.matchAll-Methode hat, wird es implizit in einRegExpumgewandelt, indemnew RegExp(regexp, 'g')verwendet wird.Wenn
regexpein Regex ist, dann muss es das globale (g)-Flag gesetzt haben, sonst wird einTypeErrorausgelöst.
Rückgabewert
Einiterables Iterator-Objekt (das nicht neu gestartet werden kann) von Übereinstimmungen oder ein leerer Iterator, wenn keine Übereinstimmungen gefunden werden. Jeder vom Iterator zurückgegebene Wert ist ein Array mit derselben Form wie der Rückgabewert vonRegExp.prototype.exec().
Ausnahmen
TypeErrorWird ausgelöst, wenn das
regexpein Regex ist, das nicht das globale (g)-Flag gesetzt hat (seineflags-Eigenschaft enthält kein"g").
Beschreibung
Die Implementierung vonString.prototype.matchAll macht nicht viel mehr, als dieSymbol.matchAll-Methode des Arguments mit der Zeichenkette als erstem Parameter aufzurufen (abgesehen von der zusätzlichen Eingabevalidierung, dass der Regex global ist). Die eigentliche Implementierung kommt vonRegExp.prototype[Symbol.matchAll]().
Beispiele
>Regexp.prototype.exec() und matchAll()
OhnematchAll() ist es möglich, Aufrufe vonregexp.exec() (und Regexe mit demg-Flag) in einer Schleife zu verwenden, um alle Übereinstimmungen zu erhalten:
const regexp = /foo[a-z]*/g;const str = "table football, foosball";let match;while ((match = regexp.exec(str)) !== null) { console.log( `Found ${match[0]} start=${match.index} end=${regexp.lastIndex}.`, );}// Found football start=6 end=14.// Found foosball start=16 end=24.MitmatchAll() können Sie diewhile-Schleife undexec mitg vermeiden. Stattdessen erhalten Sie einen Iterator, den Sie mit den bequemerenfor...of,Array Spread oderArray.from()-Konstruktionen verwenden können:
const regexp = /foo[a-z]*/g;const str = "table football, foosball";const matches = str.matchAll(regexp);for (const match of matches) { console.log( `Found ${match[0]} start=${match.index} end=${ match.index + match[0].length }.`, );}// Found football start=6 end=14.// Found foosball start=16 end=24.// matches iterator is exhausted after the for...of iteration// Call matchAll again to create a new iteratorArray.from(str.matchAll(regexp), (m) => m[0]);// [ "football", "foosball" ]matchAll wird eine Ausnahme auslösen, wenn dasg-Flag fehlt.
const regexp = /[a-c]/;const str = "abc";str.matchAll(regexp);// TypeErrormatchAll erstellt intern eine Kopie desregexp — anders als beiregexp.exec() ändert sichlastIndex nicht, während die Zeichenkette durchsucht wird.
const regexp = /[a-c]/g;regexp.lastIndex = 1;const str = "abc";Array.from(str.matchAll(regexp), (m) => `${regexp.lastIndex} ${m[0]}`);// [ "1 b", "1 c" ]Dies bedeutet jedoch, dass Sie im Gegensatz zur Verwendung vonregexp.exec() in einer SchleifelastIndex nicht ändern können, um das Regex vor- oder zurückzusetzen.
Besserer Zugriff auf Capturing-Gruppen (als String.prototype.match())
Ein weiterer überzeugender Grund fürmatchAll ist der verbesserte Zugang zu Capturing-Gruppen.
Capturing-Gruppen werden ignoriert, wennmatch() mit dem globaleng-Flag verwendet wird:
const regexp = /t(e)(st(\d?))/g;const str = "test1test2";str.match(regexp); // ['test1', 'test2']MitmatchAll können Sie leicht auf Capturing-Gruppen zugreifen:
const array = [...str.matchAll(regexp)];array[0];// ['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', length: 4]array[1];// ['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', length: 4]Verwendung von matchAll() mit einem Nicht-RegExp-Objekt, das[Symbol.matchAll]() implementiert
Wenn ein Objekt eineSymbol.matchAll-Methode hat, kann es als benutzerdefinierter Matcher verwendet werden. Der Rückgabewert vonSymbol.matchAll wird zum Rückgabewert vonmatchAll().
const str = "Hmm, this is interesting.";str.matchAll({ [Symbol.matchAll](str) { return [["Yes, it's interesting."]]; },}); // returns [["Yes, it's interesting."]]Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-string.prototype.matchall> |