String.prototype.replaceAll()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit August 2020 browserübergreifend verfügbar.
Die replaceAll()-Methode von String-Werten gibt einen neuen String zurück, bei dem alle Vorkommen eines pattern durch einen replacement ersetzt werden. Das pattern kann ein String oder ein RegExp sein, und der replacement kann ein String oder eine Funktion sein, die für jedes Vorkommen aufgerufen wird. Der ursprüngliche String bleibt unverändert.
Probieren Sie es aus
const paragraph = "This dog's name is just Dog! Yes, that is the name.";
console.log(paragraph.replaceAll("name", "nickname"));
// Expected output: "This dog's nickname is just Dog! Yes, that is the nickname."
console.log(paragraph.replaceAll(/\bis\b/g, "was"));
// Expected output: "This dog's name was just Dog! Yes, that was the name."
Syntax
replaceAll(pattern, replacement)
Parameter
pattern-
Kann ein String oder ein Objekt mit einer
Symbol.replace-Methode sein — das typische Beispiel ist ein regulärer Ausdruck. Jeder Wert, der dieSymbol.replace-Methode nicht hat, wird in einen String umgewandelt.Wenn
patternein Regex ist, muss er das globale (g)-Flag gesetzt haben, ansonsten wird einTypeErrorausgelöst. replacement-
Kann ein String oder eine Funktion sein. Der Ersatz hat die gleiche Semantik wie der von
String.prototype.replace().
Rückgabewert
Ein neuer String, bei dem alle Vorkommen eines Musters durch einen Ersatz ersetzt werden.
Ausnahmen
TypeError-
Wird ausgelöst, wenn das
patternein Regex ist, das nicht das globale (g)-Flag gesetzt hat (dessenflags-Eigenschaft enthält kein"g").
Beschreibung
Diese Methode verändert nicht den String-Wert, auf dem sie aufgerufen wird. Sie gibt einen neuen String zurück.
Im Gegensatz zu replace() ersetzt diese Methode alle Vorkommen eines Strings, nicht nur das erste. Während es auch möglich ist, replace() mit einem globalen Regex zu verwenden, das dynamisch mit RegExp() konstruiert wurde, um alle Instanzen eines Strings zu ersetzen, kann dies unbeabsichtigte Folgen haben, wenn der String spezielle Zeichen enthält, die in regulären Ausdrücken eine Bedeutung haben (was passieren könnte, wenn der Ersatzstring von Benutzereingaben stammt). Während Sie diesen Fall abmildern können, indem Sie RegExp.escape() verwenden, um den regulären Ausdruck in ein literales Muster zu verwandeln, ist es einfacher, den String direkt an replaceAll() zu übergeben, ohne ihn in einen Regex umzuwandeln.
function unsafeRedactName(text, name) {
return text.replace(new RegExp(name, "g"), "[REDACTED]");
}
function semiSafeRedactName(text, name) {
return text.replaceAll(name, "[REDACTED]");
}
function superSafeRedactName(text, name) {
// only match at word boundaries
return text.replaceAll(
new RegExp(`\\b${RegExp.escape(name)}\\b`, "g"),
"[REDACTED]",
);
}
let report =
"A hacker called ha.*er used special characters in their name to breach the system.";
console.log(unsafeRedactName(report, "ha.*er")); // "A [REDACTED]s in their name to breach the system."
console.log(semiSafeRedactName(report, "ha.*er")); // "A hacker called [REDACTED] used special characters in their name to breach the system."
report = "A hacker called acke breached the system.";
console.log(semiSafeRedactName(report, "acke")); // "A h[REDACTED]r called [REDACTED] breached the system."
console.log(superSafeRedactName(report, "acke")); // "A hacker called [REDACTED] breached the system."
Wenn pattern ein Objekt mit einer Symbol.replace-Methode ist (einschließlich RegExp-Objekten), wird diese Methode mit dem Zielstring und replacement als Argumente aufgerufen. Ihr Rückgabewert wird zum Rückgabewert von replaceAll(). In diesem Fall ist das Verhalten von replaceAll() vollständig durch die [Symbol.replace]()-Methode kodiert und hat daher dasselbe Ergebnis wie replace() (abgesehen von der zusätzlichen Eingabevalidierung, dass der Regex global ist).
Wenn das pattern ein leerer String ist, wird der Ersatz zwischen jedes UTF-16-Code-Unit eingefügt, ähnlich dem Verhalten von split().
"xxx".replaceAll("", "_"); // "_x_x_x_"
Für mehr Informationen darüber, wie Regex-Eigenschaften (insbesondere das sticky-Flag) mit replaceAll() interagieren, siehe RegExp.prototype[Symbol.replace]().
Beispiele
>Verwendung von replaceAll()
"aabbcc".replaceAll("b", ".");
// 'aa..cc'
Nicht-globaler Regex wirft Fehler
Bei Verwendung eines regulären Ausdrucks als Suchwert muss er global sein. Das funktioniert nicht:
"aabbcc".replaceAll(/b/, ".");
// TypeError: replaceAll must be called with a global RegExp
Das wird funktionieren:
"aabbcc".replaceAll(/b/g, ".");
("aa..cc");
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-string.prototype.replaceall> |