Start · Sprachen · JavaScript · Referenz · String.prototype.replaceAll()

String.prototype.replaceAll()

Methode

Die <code>replaceAll()</code>-Methode gibt einen neuen String zurück, in dem alle Übereinstimmungen eines Musters durch eine Ersetzung ersetzt wurden.

Kategorie: method-property

Signatur

replaceAll(pattern, replacement)

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

Typ
string
Beschreibung
Ein neuer String, in dem alle Übereinstimmungen des 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

Wirft einen TypeError, wenn pattern ein regex ist, dessen globales (g) Flag nicht gesetzt ist (dessen flags-Eigenschaft nicht "g" enthält).