TypeError: matchAll/replaceAll muss mit einem globalen RegExp aufgerufen werden
Die JavaScript-Ausnahme "TypeError: matchAll/replaceAll muss mit einem globalen RegExp aufgerufen werden" 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.
Nachricht
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 schiefgelaufen ist
Die Methoden String.prototype.matchAll()
und String.prototype.replaceAll()
erfordern ein RegExp
-Objekt mit dem global
-Flag. Dieses Flag gibt an, dass der reguläre Ausdruck alle Vorkommen der Eingabezeichenkette durchsuchen kann und nicht beim ersten Treffer stoppt. 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 klarzumachen.
Es ist zu beachten, dass die g
-Flag-Validierung in den Methoden matchAll
und replaceAll
durchgeführt wird. Wenn Sie stattdessen die Methode [Symbol.matchAll]()
des RegExp
verwenden, erhalten Sie diesen Fehler nicht, es gibt jedoch nur einen einzigen Treffer.
Beispiele
Ungültige Fälle
"abc".matchAll(/./); // TypeError
"abc".replaceAll(/./, "f"); // TypeError
Gültige Fälle
Wenn Sie beabsichtigen, globale Übereinstimmungen/Ersetzungen durchzuführen: Fügen Sie entweder das g
-Flag hinzu oder konstruieren Sie ein neues RegExp
-Objekt mit dem g
-Flag, wenn Sie das ursprüngliche Regex unverändert lassen wollen.
[..."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 einzige Übereinstimmung/Ersetzung durchführen möchten: Verwenden Sie stattdessen String.prototype.match()
oder String.prototype.replace()
. Sie können auch die Methode [Symbol.matchAll]()
verwenden, wenn Sie einen Iterator wie matchAll
zurückgeben wollen, der nur einen Treffer enthält, aber das wird sehr verwirrend sein.
"abc".match(/./); // [ "a" ]
"abc".replace(/./, "f"); // "fbc"
[..././[Symbol.matchAll]("abc")]; // [[ "a" ]]