String.prototype.replace()
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
Метод replace() значений String возвращает новую строку, в которой одно, несколько или все совпадения pattern заменены на replacement. pattern может быть строкой или RegExp, а replacement может быть строкой или функцией, вызываемой для каждого совпадения. Если pattern — строка, будет заменено только первое вхождение. Исходная строка остается неизменной.
Попробуйте
const paragraph = "This dog's name is just Dog! Yes, that is the name.";
console.log(paragraph.replace("name", "nickname"));
// Expected output: "This dog's nickname is just Dog! Yes, that is the name."
console.log(paragraph.replace(/\bis\b/, "was"));
// Expected output: "This dog's name was just Dog! Yes, that is the name."
console.log(paragraph.replace(/\bis\b/g, "was"));
// Expected output: "This dog's name was just Dog! Yes, that was the name."
Синтаксис
replace(pattern, replacement)
Параметры
-
pattern - Может быть строкой или объектом с методом
Symbol.replace— типичным примером является регулярное выражение. Любое значение, не имеющее методаSymbol.replace, будет преобразовано в строку. -
replacement - Может быть строкой или функцией.
- Если это строка, она заменит подстроку, соответствующую
pattern. Поддерживается ряд специальных шаблонов замены; см. раздел Указание строки в качестве замены ниже. - Если это функция, она будет вызываться для каждого совпадения, и ее возвращаемое значение будет использоваться в качестве текста замены. Аргументы, передаваемые этой функции, описаны в разделе Указание функции в качестве замены ниже.
- Если это строка, она заменит подстроку, соответствующую
Возвращаемое значение
Новая строка, в которой одно, несколько или все совпадения шаблона заменены указанной заменой.
Описание
Этот метод не изменяет значение строки, на котором он был вызван. Он возвращает новую строку.
Строковый шаблон будет заменен только один раз. Для глобального поиска и замены используйте регулярное выражение с флагом g или используйте replaceAll() вместо этого.
Если pattern является объектом с методом Symbol.replace (включая объекты RegExp), этот метод вызывается с целевой строкой и replacement в качестве аргументов. Его возвращаемое значение становится возвращаемым значением replace(). В этом случае поведение replace() полностью кодируется методом [Symbol.replace]() — например, любое упоминание «захватывающих групп» в описании ниже на самом деле является функциональностью, предоставляемой RegExp.prototype[Symbol.replace]().
Если pattern — пустая строка, замена вставляется в начало строки.
"xxx".replace("", "_"); // "_xxx"
Регулярное выражение с флагом g — это единственный случай, когда replace() заменяет более одного раза. Дополнительную информацию о том, как свойства регулярных выражений (особенно флаг sticky) взаимодействуют с replace(), см. в RegExp.prototype[Symbol.replace]().
Указание строки в качестве замены
Строка замены может включать следующие специальные шаблоны замены:
| Шаблон | Вставляет |
|---|---|
$$ | Вставляет "$". |
$& | Вставляет совпавшую подстроку. |
$` | Вставляет часть строки, предшествующую совпавшей подстроке. |
$' | Вставляет часть строки, следующую за совпавшей подстрокой. |
$n | Вставляет n-ую (с индексацией 1) захватывающую группу, где n — положительное целое число меньше 100. |
$<Name> | Вставляет именованную захватывающую группу, где Name — имя группы. |
$n и $<Name> доступны только в том случае, если аргумент pattern является объектом RegExp. Если pattern — строка или если соответствующая захватывающая группа отсутствует в регулярном выражении, то шаблон будет заменен как литерал. Если группа присутствует, но не совпала (потому что она является частью дизъюнкции), она будет заменена пустой строкой.
"foo".replace(/(f)/, "$2");
// "$2oo"; the regex doesn't have the second group
"foo".replace("f", "$1");
// "$1oo"; the pattern is a string, so it doesn't have any groups
"foo".replace(/(f)|(g)/, "$2");
// "oo"; the second group exists but isn't matched
Указание функции в качестве замены
Вы можете указать функцию в качестве второго параметра. В этом случае функция будет вызвана после выполнения совпадения. Результат функции (возвращаемое значение) будет использоваться в качестве строки замены.
Примечание: Упомянутые выше специальные шаблоны замены не применяются к строкам, возвращаемым функцией-заменой.
Функция имеет следующую сигнатуру:
function replacer(match, p1, p2, /* …, */ pN, offset, string, groups) {
return replacement;
}
Аргументы функции следующие:
-
match - Совпавшая подстрока. (Соответствует
$&выше.) -
p1,p2, …,pN n-ая строка, найденная захватывающей группой (включая именованные захватывающие группы), при условии, что первый аргументreplace()является объектомRegExp. (Соответствует$1,$2и т. д. выше.) Например, еслиpattern—/(\a+)(\b+)/, тоp1— это совпадение для\a+, аp2— совпадение для\b+. Если группа является частью дизъюнкции (например,"abc".replace(/(a)|(b)/, replacer)), несоответствующая альтернатива будетundefined.-
offset - Смещение совпавшей подстроки в исследуемой строке. Например, если вся строка была
'abcd', а совпавшая подстрока —'bc', то этот аргумент будет1. -
string - Вся исследуемая строка.
-
groups - Объект, ключами которого являются используемые имена групп, а значениями — совпавшие части (
undefined, если не совпало). Присутствует только еслиpatternсодержит хотя бы одну именованную захватывающую группу.
Точное количество аргументов зависит от того, является ли первый аргумент объектом RegExp — и, если да, то сколько у него захватывающих групп.
Следующий пример установит newString в 'abc - 12345 - #$*%':
function replacer(match, p1, p2, p3, offset, string) {
// p1 is non-digits, p2 digits, and p3 non-alphanumerics
return [p1, p2, p3].join(" - ");
}
const newString = "abc12345#$*%".replace(/(\D*)(\d*)(\W*)/, replacer);
console.log(newString); // abc - 12345 - #$*%
Функция будет вызвана несколько раз для каждого полного совпадения, которое нужно заменить, если регулярное выражение в первом параметре является глобальным.
Примеры
Определение регулярного выражения в replace()
В следующем примере регулярное выражение определено в replace() и включает флаг игнорирования регистра.
const str = "Twas the night before Xmas..."; const newStr = str.replace(/xmas/i, "Christmas"); console.log(newStr); // Twas the night before Christmas...
Это выводит в консоль 'Twas the night before Christmas...'.
Примечание: См. руководство по регулярным выражениям для дополнительных объяснений о регулярных выражениях.
Использование флагов global и ignoreCase с replace()
Глобальная замена может быть выполнена только с помощью регулярного выражения. В следующем примере регулярное выражение включает глобальный флаг и флаг игнорирования регистра, что позволяет replace() заменить каждое вхождение 'apples' в строке на 'oranges'.
const re = /apples/gi; const str = "Apples are round, and apples are juicy."; const newStr = str.replace(re, "oranges"); console.log(newStr); // oranges are round, and oranges are juicy.
Это выводит в консоль 'oranges are round, and oranges are juicy'.
Перестановка слов в строке
Следующий скрипт меняет местами слова в строке. Для текста замены скрипт использует захватывающие группы и шаблоны замены $1 и $2.
const re = /(\w+)\s(\w+)/; const str = "Maria Cruz"; const newStr = str.replace(re, "$2, $1"); console.log(newStr); // Cruz, Maria
Это выводит в консоль 'Cruz, Maria'.
Использование встроенной функции, которая изменяет совпавшие символы
В этом примере все заглавные буквы в строке преобразуются в строчные, и перед совпавшей позицией вставляется дефис. Важно то, что требуются дополнительные операции над совпавшим элементом перед его возвратом в качестве замены.
Функция замены принимает совпавший фрагмент в качестве параметра и использует его для преобразования регистра и конкатенации дефиса перед возвратом.
function styleHyphenFormat(propertyName) {
function upperToHyphenLower(match, offset, string) {
return (offset > 0 ? "-" : "") + match.toLowerCase();
}
return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
}
При styleHyphenFormat('borderTop') это возвращает 'border-top'.
Поскольку нам нужно дополнительно преобразовать результат совпадения перед выполнением окончательной подстановки, мы должны использовать функцию. Это заставляет выполнить оценку совпадения перед методом toLowerCase(). Если бы мы попытались сделать это, используя совпадение без функции, toLowerCase() не имел бы эффекта.
// Won't work const newString = propertyName.replace(/[A-Z]/g, "-" + "$&".toLowerCase());
Это потому, что '$&'.toLowerCase() сначала будет оценен как строковый литерал (результатом будет тот же '$&'), прежде чем использовать символы в качестве шаблона.
Замена градуса Фаренгейта эквивалентным градусом Цельсия
Следующий пример заменяет градус Фаренгейта эквивалентным градусом Цельсия. Градус Фаренгейта должен быть числом, заканчивающимся на "F". Функция возвращает число по Цельсию, заканчивающееся на "C". Например, если входное число — "212F", функция возвращает "100C". Если число — "0F", функция возвращает "-17.77777777777778C".
Регулярное выражение test проверяет любое число, заканчивающееся на F. Количество градусов Фаренгейта доступно функции через ее второй параметр, p1. Функция устанавливает число по Цельсию на основе количества градусов Фаренгейта, переданного в строке в функцию f2c(). f2c() затем возвращает число по Цельсию. Эта функция аппроксимирует флаг s///e в Perl.
function f2c(x) {
function convert(str, p1, offset, s) {
return `${((p1 - 32) * 5) / 9}C`;
}
const s = String(x);
const test = /(-?\d+(?:\.\d*)?)F\b/g;
return s.replace(test, convert);
}
Создание общего заменителя
Предположим, мы хотим создать заменитель, который добавляет данные смещения к каждой совпавшей строке. Поскольку функция-заменитель уже получает параметр offset, это будет тривиально, если регулярное выражение статически известно.
"abcd".replace(/(bc)/, (match, p1, offset) => `${match} (${offset}) `);
// "abc (1) d"
Однако этот заменитель будет трудно обобщить, если мы хотим, чтобы он работал с любым шаблоном регулярного выражения. Заменитель является вариативным — количество аргументов, которое он получает, зависит от количества присутствующих захватывающих групп. Мы можем использовать rest parameters, но это также соберет offset, string и т. д. в массив. Тот факт, что groups может быть передано или нет в зависимости от идентификатора регулярного выражения, также затруднит общее определение того, какой аргумент соответствует offset.
function addOffset(match, ...args) {
const offset = args.at(-2);
return `${match} (${offset}) `;
}
console.log("abcd".replace(/(bc)/, addOffset)); // "abc (1) d"
console.log("abcd".replace(/(?<group>bc)/, addOffset)); // "abc (abcd) d"
Пример addOffset выше не работает, когда регулярное выражение содержит именованную группу, потому что в этом случае args.at(-2) будет string вместо offset.
Вместо этого вам нужно извлечь последние несколько аргументов на основе типа, потому что groups — это объект, а string — строка.
function addOffset(match, ...args) {
const hasNamedGroups = typeof args.at(-1) === "object";
const offset = hasNamedGroups ? args.at(-3) : args.at(-2);
return `${match} (${offset}) `;
}
console.log("abcd".replace(/(bc)/, addOffset)); // "abc (1) d"
console.log("abcd".replace(/(?<group>bc)/, addOffset)); // "abc (1) d"
Спецификации
Совместимость с браузерами
| Десктоп | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | |
replace |
1 |
12 |
1 |
4 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
См. также
- Polyfill of
String.prototype.replaceincore-jswith fixes and implementation of modern behavior likeSymbol.replacesupport - Руководство по регулярным выражениям
String.prototype.replaceAll()String.prototype.match()RegExp.prototype.exec()RegExp.prototype.test()Symbol.replaceRegExp.prototype[Symbol.replace]()
© 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/replace