Как заменить все вхождения строки в JavaScript - PullRequest
3824 голосов
/ 17 июля 2009

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

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

Doing

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

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

Ответы [ 55 ]

33 голосов
/ 17 июля 2009

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

str.replace(/abc/g, '');
30 голосов
/ 20 июня 2015

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

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

    return text;
}
28 голосов
/ 06 июня 2017

Использование RegExp в JavaScript может сделать эту работу за вас, просто сделайте что-то, как показано ниже, не забывайте /g, после которого выделяется global :

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

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

String.prototype.replaceAll = String.prototype.replaceAll || function(string, replaced) {
  return this.replace(new RegExp(string, 'g'), replaced);
};

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

var str ="Test abc test test abc test test test abc test test abc";
str = str.replaceAll('abc', '');

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

23 голосов
/ 04 апреля 2014

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

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

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

Это почти в два раза быстрее, чем метод разделения и соединения.

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

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

  • Обновление от 27 июля 2017 года. Похоже, что у RegExp самая высокая производительность в недавно выпущенном Chrome 59.
23 голосов
/ 05 июня 2013

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

    function replaceAll(find, replace, str) 
    {
      while( str.indexOf(find) > -1)
      {
        str = str.replace(find, replace);
      }
      return str;
    }
23 голосов
/ 28 декабря 2017
str = str.replace(new RegExp("abc", 'g'), "");

работал лучше для меня, чем приведенные выше ответы. поэтому new RegExp("abc", 'g') создает RegExp, который соответствует всему вхождению ('g' флаг) текста ("abc"). Вторая часть - это то, что заменяется в вашем случае пустой строкой (""). str - это строка, и мы должны переопределить ее, поскольку replace(...) просто возвращает результат, но не переопределяет. В некоторых случаях вы можете использовать это.

19 голосов
/ 20 июня 2013

Если то, что вы хотите найти, уже находится в строке, и у вас нет удобного регулярного выражения, вы можете использовать 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'));
17 голосов
/ 29 сентября 2014
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;
}
15 голосов
/ 15 мая 2013

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

text = text.replace(new RegExp("cat","g"), "dog"); 
12 голосов
/ 29 апреля 2014
while (str.indexOf('abc') !== -1)
{
    str = str.replace('abc', '');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...