Как заменить все вхождения строки?

У меня есть эта строка:

"Test abc test test abc test test test abc test test abc"

Выполнение:

str = str.replace('abc', '');

, кажется, удаляет только первое вхождение abc в приведенной выше строке.

Как я могу заменить все его вхождения?

3921
задан Alexander Abakumov 15 July 2019 в 15:50
поделиться

7 ответов

Примечание: не используйте это в коде, критичном к производительности.

В качестве альтернативы регулярным выражениям для простой буквальной строки вы можете использовать

str = "Test abc test test abc test...".split("abc").join("");

Общий шаблон

str.split(search).join(replacement)

Раньше в некоторых случаях это было быстрее, чем использование replaceAll и регулярного выражения, но, похоже, в современных браузерах это уже не так.

Бенчмарк: https://jsperf.com/replace-all-vs-split-join

Заключение: если у вас критический вариант использования (например, обработка сотен строк), используйте метод Regexp . Но для большинства типичных случаев использования не стоит беспокоиться о специальных символах.

1308
ответ дан 16 December 2019 в 20:43
поделиться

Соответствует глобальному регулярному выражению:

anotherString = someString.replace(/cat/g, 'dog');
63
ответ дан 16 December 2019 в 20:43
поделиться

Использование регулярного выражения с установленным флагом g заменит все:

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

См. Также здесь

638
ответ дан 16 December 2019 в 20:43
поделиться
str = str.replace(/abc/g, '');

Или попробуйте функцию replaceAll отсюда:

Какие полезные методы JavaScript, расширяющие встроенные объекты?

str = str.replaceAll('abc', ''); OR

var search = 'abc';
str = str.replaceAll(search, '');

РЕДАКТИРОВАТЬ: Пояснение о доступности replaceAll

Метод replaceAll добавлен в прототип String. Это означает, что он будет доступен для всех строковых объектов / литералов.

Например,

var output = "test this".replaceAll('this', 'that');  //output is 'test that'.
output = output.replaceAll('that', 'this'); //output is 'test this'
42
ответ дан 16 December 2019 в 20:43
поделиться

Используйте регулярное выражение:

str.replace(/abc/g, '');
35
ответ дан 16 December 2019 в 20:43
поделиться
str = str.replace(/abc/g, '');

В ответ на комментарий:

var find = 'abc';
var re = new RegExp(find, 'g');

str = str.replace(re, '');

В ответ на комментарий Click Upvote вы можете даже упростить его подробнее:

function replaceAll(str, find, replace) {
    return str.replace(new RegExp(find, 'g'), replace);
}

Примечание: Регулярные выражения содержат специальные (мета) символы, и поэтому опасно слепо передавать аргумент в вышеупомянутой функции find без предварительной обработки для экранирования этих символов. . Это описано в Mozilla Developer Network Руководство по JavaScript по регулярным выражениям , где они представляют следующую служебную функцию:

function escapeRegExp(str) {
    return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}

Итак, чтобы заставить replaceAll ( ) выше безопаснее, его можно изменить на следующее, если вы также включите escapeRegExp :

function replaceAll(str, find, replace) {
    return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}
4158
ответ дан 16 December 2019 в 20:43
поделиться

В ноябре 2019 новая опция в настоящее время добавляется к JavaScript string.prototype.replaceAll(), это только поддерживается со столпотворением. JS, но возможно в будущем это может быть реализовано во всех браузерах. для получения дополнительной информации читайте здесь площадь https://v8.dev/features/string-replaceall

1
ответ дан 16 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: