Signatur
Beschreibung
Die replaceAll()-Methode von String-Werten gibt einen neuen String zurück, in dem alle Übereinstimmungen eines pattern durch einen replacement ersetzt wurden. Das pattern kann ein String oder ein RegExp sein, und das replacement kann ein String oder eine Funktion sein, die für jede Übereinstimmung aufgerufen wird. Der ursprüngliche String bleibt unverändert.
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. Es ist zwar auch möglich, replace() mit einem dynamisch mittels RegExp() konstruierten globalen regex zu verwenden, um alle Vorkommen eines Strings zu ersetzen, dies kann jedoch unbeabsichtigte Folgen haben, wenn der String Sonderzeichen enthält, die in regulären Ausdrücken eine Bedeutung haben (was passieren kann, wenn der Ersetzungsstring aus Benutzereingaben stammt). Diesen Fall kann man zwar mit RegExp.escape() abmildern, um den regulären Ausdrucksstring in ein literales Muster umzuwandeln, aber es ist einfacher, den String direkt an replaceAll() zu übergeben, ohne ihn in einen regex zu konvertieren.
Wenn pattern ein Objekt mit einer Symbol.replace-Methode ist (einschließlich RegExp-Objekten), wird diese Methode mit dem Zielstring und replacement als Argumenten 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 wird daher das gleiche Ergebnis wie replace() haben (abgesehen von der zusätzlichen Eingabevalidierung, dass der regex global ist).
Wenn das pattern ein leerer String ist, wird das replacement zwischen jeder UTF-16-Codeeinheit eingefügt, ähnlich dem Verhalten von split().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $pattern Pflicht | string | RegExp | { [Symbol.replace]: Function } | — | Kann ein String oder ein Objekt mit einer Symbol.replace-Methode sein — das typische Beispiel ist ein regulärer Ausdruck. Jeder Wert, der keine Symbol.replace-Methode besitzt, wird zu einem String konvertiert. Wenn pattern ein regex ist, muss das globale (g) Flag gesetzt sein, sonst wird ein TypeError geworfen. |
| $replacement Pflicht | string | Function | — | Kann ein String oder eine Funktion sein. Das replacement hat die gleiche Semantik wie das von String.prototype.replace(). |
Rückgabewert
pattern durch das replacement ersetzt wurden.Beispiele
Verwendung von replaceAll()
"aabbcc".replaceAll("b", ".");
// 'aa..cc'
Nicht-globaler regex wirft Fehler
"aabbcc".replaceAll(/b/, ".");
// TypeError: replaceAll must be called with a global RegExp
Korrekte Verwendung mit globalem Flag
"aabbcc".replaceAll(/b/g, ".");
("aa..cc");
Leeres pattern
"xxx".replaceAll("", "_"); // "_x_x_x_"
Sichere Ersetzung von Benutzereingaben
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) {
// Nur an Wortgrenzen matchen
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."
// Wichtig · Fallstricke
TypeError, wenn pattern ein regex ist, dessen globales (g) Flag nicht gesetzt ist (dessen flags-Eigenschaft nicht "g" enthält).