Spec-Zone.ru › JavaScript

String.prototype.replaceAll()

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с августа 2020 года.

Метод replaceAll() для значений String возвращает новую строку, в которой все совпадения с pattern заменены на replacement. pattern может быть строкой или RegExp, а replacement может быть строкой или функцией, вызываемой для каждого совпадения. Исходная строка остается неизменной.

Попробуйте

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."

Синтаксис

replaceAll(pattern, replacement)

Параметры

pattern

Может быть строкой или объектом с методом Symbol.replace — типичным примером является регулярное выражение. Любое значение, не имеющее метода Symbol.replace, будет приведено к строке.

Если pattern является регулярным выражением, то оно должно иметь установленный флаг глобального поиска (g), иначе будет выброшено исключение TypeError.

replacement
Может быть строкой или функцией. Замена имеет ту же семантику, что и в String.prototype.replace().

Возвращаемое значение

Новая строка, в которой все совпадения с шаблоном заменены заменой.

Исключения

TypeError
Выбрасывается, если pattern является регулярным выражением, у которого не установлен флаг глобального поиска (g) (его свойство flags не содержит "g").

Описание

Этот метод не изменяет строковое значение, на котором он вызван. Он возвращает новую строку.

В отличие от replace(), этот метод заменяет все вхождения строки, а не только первое. Хотя также возможно использовать replace() с глобальным регулярным выражением, динамически построенным с помощью RegExp(), для замены всех вхождений строки, это может привести к непредвиденным последствиям, если строка содержит специальные символы, имеющие значение в регулярных выражениях (что может произойти, если строка замены поступает от пользовательского ввода). Хотя вы можете смягчить этот случай, используя RegExp.escape() для преобразования строки регулярного выражения в литеральный шаблон, проще передать строку в replaceAll() напрямую, без преобразования ее в регулярное выражение.

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."

Если pattern является объектом с методом Symbol.replace (включая объекты RegExp), этот метод вызывается с целевой строкой и replacement в качестве аргументов. Его возвращаемое значение становится возвращаемым значением replaceAll(). В этом случае поведение replaceAll() полностью определяется методом [Symbol.replace](), и поэтому оно будет иметь тот же результат, что и replace() (за исключением дополнительной проверки ввода на глобальность регулярного выражения).

Если pattern — это пустая строка, замена будет вставлена между каждой кодовой единицей UTF-16, аналогично поведению split().

"xxx".replaceAll("", "_"); // "_x_x_x_"

Для получения дополнительной информации о том, как свойства регулярных выражений (особенно флаг sticky) взаимодействуют с replaceAll(), см. RegExp.prototype[Symbol.replace]().

Примеры

Использование replaceAll()

"aabbcc".replaceAll("b", ".");
// 'aa..cc'

Неглобальное регулярное выражение выбрасывает исключение

При использовании значения поиска в виде регулярного выражения оно должно быть глобальным. Этот код не сработает:

"aabbcc".replaceAll(/b/, ".");
// TypeError: replaceAll must be called with a global RegExp

А этот сработает:

"aabbcc".replaceAll(/b/g, ".");
("aa..cc");

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-string.prototype.replaceall

Совместимость с браузерами

Desktop Mobile Server
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
replaceAll
85
85
77
71
13.1
85
79
60
13.4
14.0
85
13.4
1.0.0
1.2
15.0.0

Смотрите также

  • Полифил String.prototype.replaceAll в core-js
  • Полифил String.prototype.replaceAll от es-shims
  • Руководство по регулярным выражениям
  • String.prototype.replace()
  • String.prototype.match()
  • RegExp.prototype.exec()
  • RegExp.prototype.test()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API