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

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

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

Выполнение:

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

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

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

17.07.2009 17:53:46
При замене всех вхождений abaв ababaс ca, что приводит вы ожидаете? caba? abca? cca?
reinierpost 2.08.2019 12:58:23
30 ОТВЕТОВ
РЕШЕНИЕ

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

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

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. Но для большинства типичных случаев лучше не беспокоиться о специальных символах.

1550
13.12.2019 16:10:37
Меня это удивило, так как я ожидал, что этот метод будет распределять больше объектов, создавать больше мусора и, следовательно, занимать больше времени, но когда я действительно тестировал в браузере, этот метод был примерно на 20% быстрее, чем принятый ответ. Результаты могут отличаться, конечно.
MgSam 20.09.2013 20:22:39
Мне было любопытно, и я настроил это: jsperf.com/replace-all-vs-split-join . Кажется, что v8 просто безумно быстро разбивает / объединяет массивы по сравнению с другими движками javascript.
fabi 23.11.2013 21:02:01
Очень приятно - также избавляет вас от возможности плохого RegExps при передаче специальных символов. Я добавляю общий флаг для «найти это и заменить его» в свойстве объекта, но был обеспокоен, нужно ли мне заменить «.» или "}" и забыл, что я использовал RegEx через 3 месяца!
tobriand 3.04.2014 08:01:15
И как String.prototype: String.prototype.replaceAll = function(f,r){return this.split(f).join(r);}. Использование: "My string".replaceAll('st', '');производит "Мое кольцо"
MacroMan 26.09.2014 11:50:30
Я не вижу причины для предупреждения не использовать это в производстве. Это не скорее хак, чем выход из регулярного выражения только потому, что вы хотите заменить несколько вхождений, но в первую очередь не нуждаетесь в регулярном выражении. Просто оберните этот так называемый «хак» в красивую replaceAllфункцию, и он станет таким же читабельным, как и все остальное. Поскольку производительность неплохая, нет причин избегать этого решения.
youen 19.04.2018 08:43:04

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

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

Смотрите здесь также

683
17.05.2016 12:15:25
Это глупо, я думаю, но глобальное регулярное выражение JS - единственный способ сделать несколько замен.
Mike 7.05.2009 02:43:39
технически вы можете циклически var sourceTextподсчитывать количество экземпляров ( numOfInstances), используя substringили разделять и подсчитывать длину (среди других стратегий), thatWhichYouWantToReplaceзатем делать for (var i = 0; i < numOfInstances; i++){ sourceText = sourceText.replace('thatWhichYouWantToReplace', '');}, или даже проще, просто использовать цикл while ( while sourceText.indexOf(thatWhichYouWantToReplace > -1){ sourceText = sourceText.replace(...)), но я не понимаю, почему вы захотите сделать это таким образом, когда использование /gтак просто и, вероятно, более производительным.
Zargold 20.03.2016 22:20:02
@Zargold Вы хотели бы сделать цикл, чтобы гарантировать, что даже после замены вы заменили все экземпляры, что является довольно распространенной ошибкой. Смотрите мой ответ ниже stackoverflow.com/a/26089052/87520
SamGoody 27.11.2019 14:57:54

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

anotherString = someString.replace(/cat/g, 'dog');
66
6.05.2009 23:23:40
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 «s Guide JavaScript на регулярных выражениях , где они представляют следующую функцию полезности (которая изменилась , по крайней мере в два раза , так как этот ответ был изначально написано, так что не забудьте проверить сайт MDN для потенциальных обновлений):

function escapeRegExp(string) {
  return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

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

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}
4333
19.02.2020 14:29:33
Регулярные выражения - единственный способ выполнить это «из коробки», не реализуя свой собственный метод replaceAll. Я не предлагаю их использовать только ради их использования.
Sean Bright 17.07.2009 19:47:19
Это моя собственная функция из этого комментария: function replaceAll(find, replace,str) { var re = new RegExp(find, 'g'); str = str.replace(re, replace); return str; }
Click Upvote 17.07.2009 21:11:22
Основная оговорка replaceAllреализации заключается в том, что она не будет работать, если findсодержит метасимволы.
Martin Ender 27.08.2013 00:39:25
@SeanBright вы правы. Я использовал ваш javascript в php-коде, поэтому мне пришлось добавить дополнительную обратную косую черту, чтобы убежать. На скрипке твой код идеален. Я должен был проверить. Извинения jsfiddle.net/7y19xyq8
Onimusha 2.07.2015 16:38:10
str = str.replace(/abc/g, '');

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

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

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

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

РЕДАКТИРОВАТЬ: разъяснения о заменеВсе наличие

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

Например

var output = "test this".replaceAll('this', 'that');  //output is 'test that'.
output = output.replaceAll('that', 'this'); //output is 'test this'
44
23.05.2017 12:34:57
Можете ли вы переписать функцию replaceAll () для тех, кто не использует прототип?
Click Upvote 17.07.2009 17:57:28
@ Нажмите Upvote .... вы используете прототип, он является частью всех объектов JS. Я думаю, что вы думаете о prototype.js библиотеки JS.
seth 17.07.2009 18:20:21
Сет, немного исправлений. Если вы добавите метод к прототипу, он будет доступен для всех объектов этого типа. Метод replceAll был добавлен в прототип String, и он должен работать для всех строковых объектов.
SolutionYogi 17.07.2009 18:23:53
@solutionyogi - Да, я использовал прототип (правильно) раньше. Я только что обратился к комментарию ОП по поводу «не использовать прототип», который, как я предполагал, имел в виду Prototype.js (возможно, неправильно?). Я должен был сказать «прототип», поскольку я пытался сказать, что объекты JavaScript имеют прототип. Таким образом, ОП уже «использовал прототип», хотя и «косвенным» образом. Косвенный может быть неправильный термин, чтобы использовать здесь, но я устал, так что я виноват.
seth 17.07.2009 23:41:22

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

str.replace(/abc/g, '');
37
27.05.2017 21:56:32

Моя реализация, очень понятно

function replaceAll(string, token, newtoken) {
    if(token!=newtoken)
    while(string.indexOf(token) > -1) {
        string = string.replace(token, newtoken);
    }
    return string;
}
5
3.04.2013 03:11:35
Это неверно replaceAll("123434", "1234", "12")должен вернуться, "1234"но вместо этого возвращается "12".
Bryan 16.04.2013 13:58:11
это зависит от того, позволите ли вы заменить «рекурсивно» или нет.
Vitim.us 16.04.2013 16:16:02
replaceAll ("abc", "a", "ab") никогда не завершается
user1002973 16.05.2013 14:44:43

Обновить:

Уже несколько поздно для обновления, но так как я просто наткнулся на этот вопрос и заметил, что мой предыдущий ответ не тот, которым я доволен. Поскольку вопрос касался замены одного слова, невероятно, что никто не думал об использовании границ слов ( \b).

'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"

Это простое регулярное выражение, которое в большинстве случаев избегает замены частей слов. Тем не менее, тире -все еще считается границей слова. Поэтому в этом случае можно использовать условные выражения, чтобы избежать замены строк, таких как cool-cat:

'a cat is not a cool-cat'.replace(/\bcat\b/gi,'dog');//wrong
//"a dog is not a cool-dog" -- nips
'a cat is not a cool-cat'.replace(/(?:\b([^-]))cat(?:\b([^-]))/gi,'$1dog$2');
//"a dog is not a cool-cat"

в основном, этот вопрос такой же, как и здесь: Javascript заменяет «» на «»

@ Майк, проверь ответ, который я там дал ... Регулярное выражение - не единственный способ заменить несколько вхождений подстроки, это далеко не так. Думай гибко, думай о разделении!

var newText = "the cat looks like a cat".split('cat').join('dog');

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

var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");

Вывод такой же, как принятый ответ, однако с использованием выражения / cat / g в этой строке:

var oops = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/cat/g,'dog');
//returns "the dog looks like a dog, not a dogerpillar or cooldog" ?? 

Ой, действительно, это, вероятно, не то, что вы хотите. Что же тогда? ИМХО, регулярное выражение, которое заменяет только 'условно'. (то есть не часть слова), вот так:

var caterpillar = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
//return "the dog looks like a dog, not a caterpillar or coolcat"

Я думаю, это отвечает вашим потребностям. Конечно, это не полная защита, но этого должно быть достаточно, чтобы вы начали. Я бы порекомендовал прочитать еще на этих страницах. Это окажется полезным в совершенствовании этого выражения для удовлетворения ваших конкретных потребностей.

http://www.javascriptkit.com/jsref/regexp.shtml

http://www.regular-expressions.info


Заключительное дополнение:

Учитывая, что этот вопрос по-прежнему получает много просмотров, я подумал, что мог бы добавить пример .replaceиспользования с функцией обратного вызова. В этом случае это значительно упрощает выражение и обеспечивает еще большую гибкость, например, замену на правильную заглавную букву или замену обоих catи сразу cats:

'Two cats are not 1 Cat! They\'re just cool-cats, you caterpillar'
   .replace(/(^|.\b)(cat)(s?\b.|$)/gi,function(all,char1,cat,char2)
    {
       //check 1st, capitalize if required
       var replacement = (cat.charAt(0) === 'C' ? 'D' : 'd') + 'og';
       if (char1 === ' ' && char2 === 's')
       {//replace plurals, too
           cat = replacement + 's';
       }
       else
       {//do not replace if dashes are matched
           cat = char1 === '-' || char2 === '-' ? cat : replacement;
       }
       return char1 + cat + char2;//return replacement string
    });
//returns:
//Two dogs are not 1 Dog! They're just cool-cats, you caterpillar
87
23.05.2017 11:47:36
Я думаю, что дополнительная интересная часть должна быть размещена внизу. PS: Я только что заметил, что половина первой строки находится за пределами области, позвольте мне разрешить это исправить!
user669677 4.07.2013 16:31:06

Вот функция-прототип строки, основанная на принятом ответе:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find, 'g'), replace);
};

РЕДАКТИРОВАТЬ

Если у вас findбудут специальные символы, вам нужно их избежать:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
};

Скрипка: http://jsfiddle.net/cdbzL/

108
7.10.2013 16:40:16
Но что, если findсодержит такие символы, как .или $которые имеют специальные значения в регулярных выражениях?
callum 7.10.2013 11:30:27
@callum В этом случае вам придется экранировать переменную find (см. выше).
jesal 7.10.2013 16:41:14
jesal, это замечательное решение проблемы замены строк, с которой я столкнулся, и оно, по-видимому, преодолевает «неизменность» строк в JavaScript. Не могли бы вы или кто-то еще объяснить, как эта функция-прототип переопределяет неизменность строк? Это делает работу; Я просто хочу понять этот вспомогательный вопрос, который он ставит.
Tom 12.01.2016 00:08:38
@Tom: он вообще не преодолевает неизменность: var str = thisсоздает вторую ссылку на неизменяемую строку, к которой применяется replaceметод, который, в свою очередь, возвращает новую неизменяемую строку . Эти функции-прототипы возвращают новую неизменяемую строку, если нет, вы сможете написать someStrVar.replaceAll('o', '0');и someStrVarбудут изменены. Вместо этого вы должны написать someStrVar = someStrVar.replaceAll('o', '0');<- переназначить, чтобы установить переменную для хранения новой неизменной строки . нет способа обойти это. Попробуйте в консоли:x = 'foobar'; x.replaceAll('o', '0'); x;
Elias Van Ootegem 15.06.2016 16:26:00

Мне нравится этот метод (выглядит немного чище):

text = text.replace(new RegExp("cat","g"), "dog"); 
16
27.05.2017 21:57:29
Хорошо, как вы избегаете строку, чтобы использовать ее в качестве шаблона регулярного выражения?
rakslice 19.06.2013 21:16:20
Я не, я просто использую это для простого текста
Owen 19.03.2019 11:58:53

// зациклить, пока число вхождений не достигнет 0. ИЛИ просто скопировать / вставить

    function replaceAll(find, replace, str) 
    {
      while( str.indexOf(find) > -1)
      {
        str = str.replace(find, replace);
      }
      return str;
    }
26
5.09.2013 14:01:12
Этот метод опасен, не используйте его. Если строка замены содержит ключевое слово поиска, то произойдет бесконечный цикл. Как минимум, сохраните результат .indexOfв переменной и используйте эту переменную в качестве второго параметра .indexOf(минус длина ключевого слова плюс длина строки замены).
Rob W 29.10.2013 11:33:41
Я подумываю сначала заменить шаблон поиска на устаревший символ Юникода, и мы уверены, что он не используется во входной строке. Как U + E000 в приватной зоне. И затем заменить его обратно к цели. Я построил это здесь. , Я не уверен, что это хорошая идея.
Lux 2.07.2014 13:42:42

Если то, что вы хотите найти, уже находится в строке, и у вас нет под рукой оператора regex escaper, вы можете использовать join / split:

    function replaceMulti(haystack, needle, replacement)
    {
        return haystack.split(needle).join(replacement);
    }

    someString = 'the cat looks like a cat';
    console.log(replaceMulti(someString, 'cat', 'dog'));

21
23.07.2018 17:42:33
Спасибо! Это решение отлично работает для моей проблемы :)
xero399 27.08.2019 07:08:45

Для полноты картины я подумал о том, какой метод я должен использовать для этого. Есть два основных способа сделать это, как предлагают другие ответы на этой странице.

Примечание. Как правило, расширение встроенных прототипов в JavaScript обычно не рекомендуется. Я предоставляю в качестве расширений прототипа String просто в целях иллюстрации, демонстрируя различные реализации гипотетического стандартного метода на Stringвстроенном прототипе.


Реализация на основе регулярных выражений

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

Разделение и объединение (функциональная) реализация

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.split(search).join(replacement);
};

Не зная слишком много о том, как регулярные выражения работают за кулисами с точки зрения эффективности, я склонялся к расколу и присоединялся к реализации в прошлом, не задумываясь о производительности. Когда я задумался о том, что является более эффективным, и по какой причине я использовал это в качестве предлога, чтобы выяснить это.

На моем компьютере с Chrome Windows 8 реализация на основе регулярных выражений является самой быстрой , а реализация разбиения и объединения выполняется на 53% медленнее . Это означает, что регулярные выражения в два раза быстрее для ввода lorem ipsum, который я использовал.

Проверьте этот тест, запустив эти две реализации друг против друга.


Как отмечается в комментарии ниже @ThomasLeduc и других, может быть проблема с реализацией на основе регулярных выражений, если она searchсодержит определенные символы, которые зарезервированы как специальные символы в регулярных выражениях . Реализация предполагает, что вызывающая сторона будет избегать строки заранее или будет передавать только те строки, которые не имеют символов в таблице в регулярных выражениях (MDN).

MDN также предоставляет реализацию, позволяющую избежать наших строк. Было бы хорошо, если бы это было также стандартизировано RegExp.escape(str), но, увы, его не существует:

function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}

Мы могли бы вызвать escapeRegExpв нашей String.prototype.replaceAllреализации, однако, я не уверен, насколько это повлияет на производительность (потенциально даже для строк, для которых экранирование не требуется, как для всех буквенно-цифровых строк).

2431
27.05.2017 21:55:56
В Android 4.1 метод regexp работает на 15% быстрее, но вы не экранируете выражение для поиска, поэтому этот тест не завершен.
andreszs 19.01.2015 00:01:14
Существует проблема с этим решением, если строка поиска содержит специальные символы выражения регулярного выражения, они будут интерпретированы. Я рекомендую ответ @Sandy Unitedwolf.
Thomas Leduc 17.02.2016 16:09:35
Первый сделает это: 'bla.bla'.replaceAll ('. ',' _ '); "_______". Второй будет делать 'bla_bla', что в целом является тем, что вы хотите сделать.
RobKohr 21.02.2016 01:12:56
@ThomasLeduc похоже, что проблему, о которой вы упомянули, можно обойти с помощью lodash => lodash.com/docs/4.17.5#escapeRegExp
Matthew Beck 15.03.2018 07:47:58
Оставьте это здесь для будущих зрителей, которые также задаются вопросом, почему расширение нативного объекта является плохой идеей: stackoverflow.com/questions/14034180/…
Ben Cooper 6.04.2018 19:28:51
var str = "ff ff f f a de def";
str = str.replace(/f/g,'');
alert(str);

http://jsfiddle.net/ANHR9/

13
4.09.2013 10:01:17
какая была точка скрипки, которая содержит только тот же javascript
JGallardo 8.02.2017 00:42:52

Для замены всех видов символов попробуйте этот код:

Suppose we have need to send " and \ in my string, then we will convert it " to \" and \ to \\

Таким образом, этот метод решит эту проблему.

String.prototype.replaceAll = function (find, replace) {
     var str = this;
     return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
 };

var message = $('#message').val();
             message = message.replaceAll('\\', '\\\\'); /*it will replace \ to \\ */
             message = message.replaceAll('"', '\\"');   /*it will replace " to \\"*/

Я использовал Ajax, и мне нужно было отправить параметры в формате JSON. Тогда мой метод выглядит так:

 function sendMessage(source, messageID, toProfileID, userProfileID) {

     if (validateTextBox()) {
         var message = $('#message').val();
         message = message.replaceAll('\\', '\\\\');
         message = message.replaceAll('"', '\\"');
         $.ajax({
             type: "POST",
             async: "false",
             contentType: "application/json; charset=utf-8",
             url: "services/WebService1.asmx/SendMessage",
             data: '{"source":"' + source + '","messageID":"' + messageID + '","toProfileID":"' + toProfileID + '","userProfileID":"' + userProfileID + '","message":"' + message + '"}',
             dataType: "json",
             success: function (data) {
                 loadMessageAfterSend(toProfileID, userProfileID);
                 $("#<%=PanelMessageDelete.ClientID%>").hide();
                 $("#message").val("");
                 $("#delMessageContainer").show();
                 $("#msgPanel").show();
             },
             error: function (result) {
                 alert("message sending failed");
             }
         });
     }
     else {
         alert("Please type message in message box.");
         $("#message").focus();

     }
 }

 String.prototype.replaceAll = function (find, replace) {
     var str = this;
     return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
 };
5
27.05.2017 21:59:37

Попробуй это:

String.prototype.replaceAll = function (sfind, sreplace) {
    var str = this;

    while (str.indexOf(sfind) > -1) {
        str = str.replace(sfind, sreplace);
    }

    return str;
};
1
15.10.2016 17:51:06
если замена содержит «найти», у тебя будет бесконечный цикл
Jonatha ANTOINE 24.06.2016 08:43:08

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

Пересмотренный jsperf

replaceAll = function(string, omit, place, prevstring) {
  if (prevstring && string === prevstring)
    return string;
  prevstring = string.replace(omit, place);
  return replaceAll(prevstring, omit, place, string)
}

Это почти в два раза быстрее, чем метод split и join.

Как указано в комментарии здесь, это не будет работать, если ваша omitпеременная содержит place, как в:, replaceAll("string", "s", "ss")потому что она всегда сможет заменить другое вхождение слова.

На моей рекурсивной замене есть еще один jsperf с вариантами, которые идут еще быстрее ( http://jsperf.com/replace-all-vs-split-join/12 )!

  • Обновление от 27 июля 2017 года. Похоже, что RegExp теперь имеет самую быструю производительность в недавно выпущенном Chrome 59.
25
27.07.2017 15:57:56
Мне понравилось ваше решение ... Я хотел бы дать вам +10, но вот мой +1. Я думаю, что вы можете сохранить индекс подстроки, которая была заменена, и перейти к следующей, если найдено совпадение с более низким индексом, чтобы избежать этой проблемы бесконечного цикла. Я не могу комментировать производительность, потому что я не тестировал ее, но это всего лишь 2 цента за этот образец совершенства.
Fr0zenFyr 10.07.2014 04:40:14
@ fr0zenfyr, если вы хотите проверить, находится ли значение omit (чтобы предотвратить бесконечный цикл), вы можете сделать условное выражение, например, if(place.replace(omit) === omit) {No match, поэтому можно безопасно использовать замену цикла } else {Match, поэтому используйте другой метод, например split и join}
Cole Lawrence 10.07.2014 12:41:44
Хм .. а какой смысл объединять два решения? Во всяком случае, я не фанат подхода split / join в любом случае .. спасибо за совет ..
Fr0zenFyr 11.07.2014 04:14:19
@ Fr0zenFyr Я полагаю, что целью объединения этих двух решений было бы использовать более медленный метод, если вы не можете использовать более быстрый метод (например, когда цикл будет бесконечным). Таким образом, было бы надежной защитой обеспечить функциональность с эффективностью, но без возможности отказа.
Cole Lawrence 11.07.2014 13:13:19
@ Момомо, как недостатки?
SandRock 8.08.2019 12:11:18
while (str.indexOf('abc') !== -1)
{
    str = str.replace('abc', '');
}
13
29.04.2014 10:25:12

Если вы можете использовать библиотеку, тогда вы получите преимущества тестирования и поддержки сообщества, которые связаны с библиотечной функцией. Например, библиотека string.js имеет функцию replaceAll (), которая делает то, что вы ищете:

// Include a reference to the string.js library and call it (for example) S.
str = S(str).replaceAll('abc', '').s;
3
14.09.2014 19:23:20

Если вы пытаетесь гарантировать, что искомая строка не будет существовать даже после замены, вам нужно использовать цикл.

Например:

var str = 'test aabcbc';
str = str.replace(/abc/g, '');

После завершения у вас все еще будет «test abc»!

Самый простой цикл для решения этой проблемы:

var str = 'test aabcbc';
while (str != str.replace(/abc/g, '')){
   str.replace(/abc/g, '');
}

Но это запускает замену дважды для каждого цикла. Возможно (рискуя быть отвергнутым), что может быть объединено для немного более эффективной, но менее читаемой формы:

var str = 'test aabcbc';
while (str != (str = str.replace(/abc/g, ''))){}
// alert(str); alerts 'test '!

Это может быть особенно полезно при поиске дубликатов строк.
Например, если у нас есть «a ,,, b» и мы хотим удалить все повторяющиеся запятые.
[В этом случае можно сделать .replace (/, + / g, ','), но в какой-то момент регулярное выражение становится сложным и достаточно медленным, чтобы выполнять цикл.]

10
28.09.2014 19:58:42
function replaceAll(str, find, replace) {
  var i = str.indexOf(find);
  if (i > -1){
    str = str.replace(find, replace); 
    i = i + replace.length;
    var st2 = str.substring(i);
    if(st2.indexOf(find) > -1){
      str = str.substring(0,i) + replaceAll(st2, find, replace);
    }       
  }
  return str;
}
19
29.09.2014 19:17:45
Интересно, насколько хорошо это работает ... подстрока является родной или перебирает массив символов для создания новых символов.
mmm 7.07.2017 09:53:32

Просто добавь /g

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

в

// Replace 'hello' string with /hello/g regular expression.
document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');

/g означает глобальный

7
15.10.2015 12:13:18

Замена одинарных кавычек:

function JavaScriptEncode(text){
    text = text.replace(/'/g,'&apos;')
    // More encode here if required

    return text;
}
32
17.12.2017 15:53:28
Как я могу изменить вторую строку, чтобы заменить строки? Это не работает: text = text.replace ('привет', 'привет'); Есть идеи?
Stefan Đorđević 9.12.2016 22:37:51
Конечно, Стефан, вот код ... text = text.replace (/ hey / g, 'hello');
Chris Rosete 12.12.2016 13:56:01

Я использую p для сохранения результата предыдущей замены рекурсии:

function replaceAll(s, m, r, p) {
    return s === p || r.contains(m) ? s : replaceAll(s.replace(m, r), m, r, s);
}

Он заменит все вхождения в строке s, пока это не станет возможным:

replaceAll('abbbbb', 'ab', 'a')  'abbbb'  'abbb'  'abb'  'ab'  'a'

Чтобы избежать бесконечного цикла, я проверяю, содержит ли замена r совпадение m :

replaceAll('abbbbb', 'a', 'ab')  'abbbbb'
7
25.02.2017 05:45:24

Вы можете просто использовать метод ниже

/**
 * Replace all the occerencess of $find by $replace in $originalString
 * @param  {originalString} input - Raw string.
 * @param  {find} input - Target key word or regex that need to be replaced.
 * @param  {replace} input - Replacement key word
 * @return {String}       Output string
 */
function replaceAll(originalString, find, replace) {
  return originalString.replace(new RegExp(find, 'g'), replace);
};
8
23.02.2016 03:47:11

У меня работает следующая функция:

String.prototype.replaceAllOccurence = function(str1, str2, ignore)
{
    return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
} ;

Теперь вызовите функции так:

"you could be a Project Manager someday, if you work like this.".replaceAllOccurence ("you", "I");

Просто скопируйте и вставьте этот код в консоли браузера в TEST.

7
18.11.2018 03:32:37

Вот рабочий код с прототипом:

String.prototype.replaceAll = function(find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"), 'g'), replace);
};
4
3.11.2016 07:54:02
function replaceAll(str, find, replace) {
    var $r="";
    while($r!=str){ 
        $r = str;
        str = str.replace(find, replace);
    }
    return str;
}
4
11.04.2016 18:01:09
если замена содержит «найти», у тебя будет бесконечный цикл
Jonatha ANTOINE 24.06.2016 08:44:01

Хотя люди упоминали об использовании регулярных выражений, но есть лучший подход, если вы хотите заменить текст независимо от случая текста. Как прописные или строчные. Используйте ниже синтаксис

//Consider below example
originalString.replace(/stringToBeReplaced/gi, '');

//Output will be all the occurrences removed irrespective of casing.

Вы можете сослаться на подробный пример здесь .

10
8.06.2016 18:51:40
из примера сайта: "/ toBeReplacedString / gi - это регулярное выражение, которое вам нужно использовать. Здесь g представляет для глобального соответствия, а i представляет без
alikuli 3.08.2016 10:15:16

Скажем, вы хотите заменить все «abc» на «x»:

let some_str = 'abc def def lom abc abc def'.split('abc').join('x')
console.log(some_str) //x def def lom x x def

Я пытался придумать что-то более простое, чем модификация прототипа строки.

40
27.05.2017 22:01:59
Простой, легкий и, пожалуй, самый производительный вариант: хороший ответ.
machineghost 25.10.2016 23:51:29
На самом деле, хотя я не оценивал это лично, разделение / соединение обычно является очень эффективным решением.
machineghost 13.01.2017 18:30:07
Это даже в Chrome, на 100% быстрее в Firefox и на 50% медленнее в IE ...: jsperf.com/replace-regex-split-join
Olivier 22.05.2018 14:39:00