TypeError: matchAll/replaceAll muss mit einem globalen RegExp aufgerufen werden
Der JavaScript-Fehler "TypeError: matchAll/replaceAll must be called with a global RegExp" tritt auf, wenn die Methode String.prototype.matchAll()
oder String.prototype.replaceAll()
mit einem RegExp
-Objekt verwendet wird, das nicht das global
-Flag gesetzt hat.
Meldung
TypeError: String.prototype.matchAll called with a non-global RegExp argument (V8-based) TypeError: String.prototype.replaceAll called with a non-global RegExp argument (V8-based) TypeError: matchAll must be called with a global RegExp (Firefox) TypeError: replaceAll must be called with a global RegExp (Firefox) TypeError: String.prototype.matchAll argument must not be a non-global regular expression (Safari) TypeError: String.prototype.replaceAll argument must not be a non-global regular expression (Safari)
Fehlerart
Was ist schiefgelaufen?
Die Methoden String.prototype.matchAll()
und String.prototype.replaceAll()
erfordern ein RegExp
-Objekt mit dem global
-Flag. Dieses Flag zeigt an, dass der reguläre Ausdruck alle Vorkommen in der Eingabestring erkennen kann, anstatt beim ersten Treffer zu stoppen. Obwohl das g
-Flag bei der Verwendung dieser Methoden redundant ist (da diese Methoden immer einen globalen Ersatz durchführen), ist es dennoch erforderlich, um die Absicht klarzustellen.
Es ist erwähnenswert, dass die Validierung des g
-Flags in den Methoden matchAll
und replaceAll
erfolgt. Wenn Sie stattdessen die Methode [Symbol.matchAll]()
von RegExp
verwenden, erhalten Sie diesen Fehler nicht, aber es wird nur ein einzelner Treffer gefunden.
Beispiele
Ungültige Fälle
"abc".matchAll(/./); // TypeError
"abc".replaceAll(/./, "f"); // TypeError
Gültige Fälle
Wenn Sie eine globale Übereinstimmung/einen globalen Ersatz durchführen möchten: Fügen Sie entweder das g
-Flag hinzu oder erstellen Sie ein neues RegExp
-Objekt mit dem g
-Flag, falls Sie den ursprünglichen regulären Ausdruck unverändert lassen möchten.
[..."abc".matchAll(/./g)]; // [[ "a" ], [ "b" ], [ "c" ]]
"abc".replaceAll(/./g, "f"); // "fff"
const existingPattern = /./;
const newPattern = new RegExp(
existingPattern.source,
`${existingPattern.flags}g`,
);
"abc".replaceAll(newPattern, "f"); // "fff"
Wenn Sie nur eine einzelne Übereinstimmung/einen einzelnen Ersatz durchführen möchten: Verwenden Sie stattdessen String.prototype.match()
oder String.prototype.replace()
. Sie können auch die [Symbol.matchAll]()
-Methode verwenden, wenn Sie einen Iterator wie matchAll
wünschen, der nur einen Treffer enthält, aber dies wird sehr verwirrend sein.
"abc".match(/./); // [ "a" ]
"abc".replace(/./, "f"); // "fbc"
[..././[Symbol.matchAll]("abc")]; // [[ "a" ]]