Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
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 MethodeString.prototype.matchAll() oderString.prototype.replaceAll() mit einemRegExp-Objekt verwendet wird, das nicht dasglobal-Flag gesetzt hat.
In diesem Artikel
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
TypeErrorWas ist schiefgelaufen?
Die MethodenString.prototype.matchAll() undString.prototype.replaceAll() erfordern einRegExp-Objekt mit demglobal-Flag. Dieses Flag zeigt an, dass der reguläre Ausdruck alle Vorkommen in der Eingabestring erkennen kann, anstatt beim ersten Treffer zu stoppen. Obwohl dasg-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 desg-Flags in den MethodenmatchAll undreplaceAll erfolgt. Wenn Sie stattdessen die Methode[Symbol.matchAll]() vonRegExp 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"); // TypeErrorGültige Fälle
Wenn Sie eine globale Übereinstimmung/einen globalen Ersatz durchführen möchten: Fügen Sie entweder dasg-Flag hinzu oder erstellen Sie ein neuesRegExp-Objekt mit demg-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 stattdessenString.prototype.match() oderString.prototype.replace(). Sie können auch die[Symbol.matchAll]()-Methode verwenden, wenn Sie einen Iterator wiematchAll 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" ]]