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");
Спецификации
Совместимость с браузерами
| 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