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

3522

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

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

Выполнение

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

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

  • 14
    stackoverflow.com/questions/1137436/...
  • 0
    Возможная копия JavaScript-эквивалента PHP preg_replace
Показать ещё 5 комментариев
Теги:
string
replace

46 ответов

1839
Лучший ответ

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

Примечание: В общем, расширение встроенных прототипов в 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 реализация на основе регулярных выражений является самой быстрой, при этом split и join реализованы на 53% медленнее. Значение регулярных выражений в два раза быстрее для ввода lorem ipsum, который я использовал.

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


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

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

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

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

  • 0
    Могу ли я спросить, для чего предназначен символ g при замене всех вхождений строки?
  • 0
    Это опция для механизма регулярных выражений, используемая при сопоставлении выражения. В частности, global опция будет соответствовать каждому экземпляру данного шаблона. Это также может быть применено к концу выражения, например так: /(.{3})/g . Модификатор g в конце предыдущего выражения соответствует тому же g использовался в моем коде.
Показать ещё 19 комментариев
3611
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);
}
  • 2
    Регулярные выражения - это единственный способ выполнить это «из коробки» без реализации собственного метода replaceAll. Я не предлагаю их использовать только ради их использования.
  • 9
    Это моя собственная функция из этого комментария: function replaceAll(find, replace,str) { var re = new RegExp(find, 'g'); str = str.replace(re, replace); return str; }
Показать ещё 15 комментариев
1236

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

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

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

Общий шаблон

str.split(search).join(replacement)

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

  • 128
    Это удивило меня, так как я ожидал, что этот метод будет выделять больше объектов, создавать больше мусора и, следовательно, займет больше времени, но когда я действительно тестировал в браузере, этот метод был примерно на 20% быстрее, чем принятый ответ. Результаты могут отличаться, конечно.
  • 0
    @MgSam Да, производительность JavaScript может определенно быть неинтуитивной и иногда противоречивой.
Показать ещё 20 комментариев
516

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

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

См. также

  • 13
    Это глупо, я думаю, но глобальное регулярное выражение JS - единственный способ сделать несколько замен.
  • 2
    технически вы можете циклически проходить через var sourceText подсчитывать количество экземпляров ( numOfInstances ), используя substring или split, и подсчитывать длину (среди других стратегий) thatWhichYouWantToReplace затем выполнить for (var i = 0; i < numOfInstances; i++){ sourceText = sourceText.replace('thatWhichYouWantToReplace', ''); } или даже проще, просто используйте цикл while ( while sourceText.indexOf(thatWhichYouWantToReplace > -1){ sourceText = sourceText.replace(...) ), но я не понимаю, почему вы захотите сделать это таким образом при использовании /g так просто и, вероятно, более производительный.
92

Здесь строковая прототипная функция, основанная на принятом ответе:

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

EDIT

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

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

Fiddle: http://jsfiddle.net/cdbzL/

  • 5
    Но что, если find содержит такие символы, как . или $ которые имеют специальные значения в регулярных выражениях?
  • 1
    @callum В этом случае вам придется экранировать переменную find (см. выше).
Показать ещё 5 комментариев
72

Обновить:

Он немного опоздал на обновление, но так как я просто наткнулся на этот вопрос и заметил, что мой предыдущий ответ не тот, которым я доволен. Поскольку вопрос заключался в замене одного слова, невероятно, что никто не думал об использовании границ слов (\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 заменить "" на "" "

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

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

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

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" ?? 

На самом деле, это, вероятно, не то, что вы хотите. Что же тогда? IMHO, регулярное выражение, которое заменяет "cat" условно. (т.е. не является частью слова), например:

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
  • 0
    Я думаю, что дополнительная интересная часть должна быть размещена внизу. ps .: Я только что заметил, что половина первой строки находится за пределами области, позвольте мне разрешить это исправить!
51

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

anotherString = someString.replace(/cat/g, 'dog');
39
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'
  • 2
    Можете ли вы переписать функцию replaceAll () для тех, кто не использует прототип?
  • 0
    @ Нажмите Upvote .... вы используете прототип, он является частью всех объектов JS. Я думаю, что вы думаете о prototype.js библиотеки JS.
Показать ещё 2 комментария
34

Предположим, вы хотите заменить все "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

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

  • 1
    Простой, легкий и, пожалуй, самый производительный вариант: хороший ответ.
  • 0
    Я не знаю, если это с точки зрения производительности, но .... это работает.
Показать ещё 2 комментария
30

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

str.replace(/abc/g, '');
27

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

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

    return text;
}
  • 2
    Как я могу изменить вторую строку, чтобы заменить строки? Это не работает: text = text.replace ('эй', 'привет'); Любая идея?
  • 2
    Конечно, Стефан, вот код ... text = text.replace (/ hey / g, 'hello');
23

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

    function replaceAll(find, replace, str) 
    {
      while( str.indexOf(find) > -1)
      {
        str = str.replace(find, replace);
      }
      return str;
    }
  • 22
    Этот метод опасен, не используйте его. Если строка замены содержит ключевое слово поиска, то произойдет бесконечный цикл. Как минимум, сохраните результат .indexOf в переменной и используйте эту переменную в качестве второго параметра .indexOf (минус длина ключевого слова плюс длина строки замены).
  • 0
    Я подумываю сначала заменить шаблон поиска на устаревший символ Юникода, и мы уверены, что он не используется во входной строке. Как U + E000 в приватной зоне. А затем заменить его обратно к цели. Я построил это здесь. , Я не уверен, что это хорошая идея.
22
str = str.replace(new RegExp("abc", 'g'), "");

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

  • 0
    Хотя этот фрагмент кода может быть решением, включение пояснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
  • 0
    Да, ты прав. добавлено. также отредактировал это, чтобы ответить на оригинальный вопрос :)
Показать ещё 1 комментарий
21

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

Пересмотренный 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.
  • 0
    Мне понравилось ваше решение ... Я хотел бы дать вам +10, но вот мой +1. Я думаю, что вы можете сохранить индекс подстроки, которая была заменена, и перейти к следующей, если найдено совпадение по более низкому индексу, чтобы избежать этой проблемы бесконечного цикла. Я не могу комментировать производительность, потому что я не тестировал ее, но это всего лишь 2 цента за этот образец совершенства.
  • 0
    @ fr0zenfyr, если вы хотите проверить, находится ли omit на месте (чтобы предотвратить бесконечный цикл), вы можете сделать условное if(place.replace(omit) === omit) { как if(place.replace(omit) === omit) { Нет соответствия, поэтому можно безопасно использовать цикл замены } else { Матч, так что используйте другой метод, как split и join }
Показать ещё 3 комментария
18

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

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-кода, если вы захотите использовать повторно.

17

Если то, что вы хотите найти, уже находится в строке, и у вас нет регулярного выражения 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'));
15
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;
}
  • 0
    Интересно, насколько хорошо это работает ... подстрока является родной или перебирает массив символов для создания новых символов.
13

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

text = text.replace(new RegExp("cat","g"), "dog"); 
  • 1
    Хорошо, как вы избегаете строку, чтобы использовать ее в качестве шаблона регулярного выражения?
  • 0
    Я не просто использую его для простого текста
12
while (str.indexOf('abc') !== -1)
{
    str = str.replace('abc', '');
}
  • 3
    @AlexK. что не так с этим? Я думал, что это было довольно мило
12
var str = "ff ff f f a de def";
str = str.replace(/f/g,'');
alert(str);

http://jsfiddle.net/ANHR9/

  • 0
    какая была точка скрипки, которая содержит только один и тот же JavaScript
11

Если строка содержит аналогичный шаблон, такой как abccc, вы можете использовать это:

str.replace(/abc(\s|$)/g, "")
10

Предыдущие ответы слишком сложны. Просто используйте функцию замены следующим образом:

str.replace(/your_regex_pattern/g, replacement_string);

Пример:

var str = "Test abc test test abc test test test abc test test abc";

var res = str.replace(/[abc]+/g, "");

console.log(res);
  • 1
    OMG спасибо! Это самый простой и лучший ответ.
9

Просто следуйте этому регулярному выражению oneliner, добавляя чувствительность к регистру, поэтому, если вы делаете "ABC", он будет действовать так же, как и для "abc".

str = str.replace(/abc/gi, "");
9

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

Например:

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, ','), но в какой-то момент регулярное выражение становится сложным и достаточно медленным, чтобы зацикливаться.]

  • 0
    Даунвотерс хочет объяснить? Ответ верен в том случае, если такое решение необходимо.
8
var string  = 'Test abc Test abc Test abc Test abc'
string = string.replace(/abc/g, '')
console.log(string)
8

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

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

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

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

  • 0
    из примера сайта: "/ toBeReplacedString / gi - это регулярное выражение, которое вам нужно использовать. Здесь g представляет для глобального соответствия, а i представляет без учета регистра. По умолчанию регулярное выражение чувствительно к регистру"
7

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

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

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

/**
 * 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);
};
7

Просто добавьте /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

Вы можете попробовать объединить эти два мощных метода.

"test abc test test abc".split("abc").join("")

Надеюсь, поможет!

6

Я использую 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'
5

Большинство людей, вероятно, делают это для кодирования URL-адреса. Чтобы закодировать URL-адрес, вы должны не только рассматривать пробелы, но и правильно преобразовывать всю строку с помощью encodeURI.

encodeURI("http://www.google.com/a file with spaces.html")

чтобы получить:

http://www.google.com/a%20file%20with%20spaces.html
4

Что касается производительности, связанной с основными ответами , то это некоторые онлайн-тесты.

Ниже приведены некоторые тесты производительности с помощью console.time() (они лучше всего работают на вашей собственной консоли, время очень короткое, что можно увидеть в фрагменте)

console.time('split and join');
"javascript-test-find-and-replace-all".split('-').join(' ');
console.timeEnd('split and join')

console.time('regular expression');
"javascript-test-find-and-replace-all".replace(new RegExp('-', 'g'), ' ');
console.timeEnd('regular expression');

console.time('while');
let str1 = "javascript-test-find-and-replace-all";
while (str1.indexOf('-') !== -1) {
    str1 = str1.replace('-', ' ');
}
console.timeEnd('while');

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

4

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

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);
 };
4

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

function replaceAll(string, token, newtoken) {
    if(token!=newtoken)
    while(string.indexOf(token) > -1) {
        string = string.replace(token, newtoken);
    }
    return string;
}
  • 1
    Это неверно replaceAll("123434", "1234", "12") должен возвращать "1234" но вместо этого возвращает "12" .
  • 1
    это зависит от того, позволите ли вы заменить «рекурсивно» или нет.
Показать ещё 1 комментарий
3

В моих приложениях я использую настраиваемую функцию, которая является самой мощной для этой цели, и даже обертывание решения split/join в более простом случае, это немного быстрее в Chrome 60 и Firefox 54 (JSBEN.CH), чем другие решения. Мой компьютер работает Windows 7 64 bits.

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

Как и решение split/join выше, нижеприведенное решение не имеет проблем с escape-символами, иначе чем подход к регулярному выражению.

  function replaceAll(s,find,repl,caseOff,byChar){
  if (arguments.length<2)  return false; 
  var destDel = ! repl;       // if destDel delete all keys from target
  var isString = !! byChar;   // if byChar, replace set of characters 
  if (typeof find !==typeof repl && ! destDel)  return false; 
  if (isString  &&  (typeof find!=="string"))   return false; 

  if (! isString &&  (typeof find==="string"))  {
    return s.split(find).join(destDel?"":repl);
  }

  if ((! isString)  &&  ( ! Array.isArray(find) ||
          ( ! Array.isArray(repl) && ! destDel)   ))  return false;

     // if destOne replace all strings/characters by just one element
  var destOne = destDel ? false : (repl.length===1);   

     // Generally source and destination should have the same size
  if (! destOne && ! destDel && find.length!==repl.length)  return false    

  var prox,sUp,findUp,i,done;   
  if (caseOff)  {    // case insensitive    
       // Working with uppercase keys and target 
    sUp = s.toUpperCase();   
    if (isString)
       findUp = find.toUpperCase()   
    else
       findUp = find.map(function(el){  return el.toUpperCase();});    

  } else  {         // case sensitive
     sUp = s;
     findUp =find.slice();  // clone array/string
  }  

  done = new Array(find.length);  // size: number of keys
  done.fill(null);              

  var pos = 0;       // initial position in target s
  var r = "";   // initial result
  var aux, winner;
  while (pos < s.length)  {       // Scanning the target
     prox  = Number.MAX_SAFE_INTEGER;
     winner = -1;  // no winner at start
     for (i=0;i<findUp.length;i++)   // find next occurence for each string
       if (done[i]!==-1) {    // key still alive
             // Never search for the word/char or is over?
         if (done[i]===null || done[i]<pos)  { 
           aux = sUp.indexOf(findUp[i],pos);
           done[i]=aux;  // Save the next occurrence
         } else
           aux = done[i]   // restore the position of last search
         if (aux<prox && aux!==-1) {   // if next occurrence is minimum
           winner = i;     // save it  
           prox = aux;
         }  
       }  // not done

      if (winner===-1) {   // No matches forward
         r += s.slice(pos);   
         break;
      } // no winner

      // found the character or string key in the target

      i = winner;  // restore the winner
      r += s.slice(pos,prox);   // update piece before the match

            // Append the replacement in target 
      if (! destDel) r += repl[ destOne?0:i ];  
      pos = prox + ( isString?1:findUp[i].length );       // go after match

  }  // loop
  return r;  // return the resulting string
}

Документация ниже

           replaceAll    
 Syntax    
 ======     
      replaceAll(s,find,[ repl ,caseOff, byChar)     

 Parameters    
 ==========    

   "s" is a string target of replacement.    
   "find" can be a string or array of strings.     
   "repl" should be the same type than "find" or empty     

  if "find" is a string, it is a simple replacement for      
    all "find" occurrences in "s" by string "repl"    

  if "find" is an array, it will replaced each string in "find"    
    that occurs in "s" for corresponding string in "repl" array.
  The replace specs are independent: A replacement part cannot    
    be replaced again. 


  if "repl" is empty all "find" occurrences in "s" will be deleted.   
  if "repl" has only one character or element,    
      all occurrences in "s" will be replaced for that one.   

  "caseOff" is true if replacement is case insensitive     
       (default is FALSE)

  "byChar" is true when replacement is based on set of characters.    
  Default is false   

  if "byChar", it will be replaced in "s" all characters in "find"   
  set of characters for corresponding character in  "repl"
  set of characters   

 Return   
 ======   
  the function returns the new string after the replacement.  

Чтобы быть справедливым, я провел тест без проверки параметров.

Вот мой тестовый набор, используя Node.js

function l() { return console.log.apply(null, arguments); }

var k=0;
l(++k,replaceAll("banana is a ripe fruit harvested near the river",
      ["ri","nea"],["do","fa"]));  //1
l(++k,replaceAll("banana is a ripe fruit harvested near the river",
      ["ri","nea"],["do"]));  //2
l(++k,replaceAll("banana is a ripe fruit harvested near the river",
      ["ri","nea"]));  //3
l(++k,replaceAll("banana is a ripe fruit harvested near the river",
     "aeiou","","",true));  //4
l(++k,replaceAll("banana is a ripe fruit harvested near the river",
      "aeiou","a","",true));  //5
l(++k,replaceAll("banana is a ripe fruit harvested near the river",
      "aeiou","uoiea","",true));  //6
l(++k,replaceAll("banana is a ripe fruit harvested near the river",
      "aeiou","uoi","",true));  //7
l(++k,replaceAll("banana is a ripe fruit harvested near the river",
      ["ri","nea"],["do","fa","leg"]));  //8
l(++k,replaceAll("BANANA IS A RIPE FRUIT HARVESTED NEAR THE RIVER",
      ["ri","nea"],["do","fa"]));  //9
l(++k,replaceAll("BANANA IS A RIPE FRUIT HARVESTED NEAR THE RIVER",
      ["ri","nea"],["do","fa"],true)); //10
return;

И результаты:

1 'банан - это плод, собранный в далеком будущем "
2" банан - это плод, собранный в допинге, дольщик "3 'банан - это плод, заготовленный r ver'
4 'bnn s rp frt hrvstd nr th rvr'
5 'банан как рапа-фраат харвастад наар та равар'
6 'bununu is u ripo frait hurvostod nour tho rivor'
7 ложных
8 ложных
9 'БАНАНА - ПИЩЕВАЯ ПЛОДА, УБЕДИТЕСЬ ВБЛИЗИ РЕКИ"
10 'BANANA - ИЗОБРАЖЕНИЕ ИЗОБРАЖЕНИЯ ИЗОБРАЖЕНИЙ, КОТОРОЕ ЗАВЕРШЕНО

  • 0
    Плохо, потому что использование такого большого количества кода для достижения чего-то такого базового кажется мне излишним.
  • 1
    Это вопрос мнения. Для меня это мощная и быстрая функция. Я использовал в течение многих лет. Нельзя сделать это на меньшем количестве строк. Для тех, кто просто хочет заменить символы и части в строках, не беспокоясь о escape-символах из регулярных выражений, это может быть хорошим выбором. Количество строк не имеет большого значения, так как работает - проверенный черный ящик
3
function replaceAll(str, find, replace) {
    var $r="";
    while($r!=str){ 
        $r = str;
        str = str.replace(find, replace);
    }
    return str;
}
  • 3
    если замена содержит «найти», у вас будет бесконечный цикл
3

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

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

Для уникальных сменных значений

String.prototype.replaceAll = function(search_array, replacement_array) {
  //
  var target = this;
  //
  search_array.forEach(function(substr, index) {
    if (typeof replacement_array[index] != "undefined") {
      target = target.replace(new RegExp(substr, 'g'), replacement_array[index])
    }
  });
  //
  return target;
};

//  Use:
var replacedString = "This topic commented on :year. Talking :question.".replaceAll([':year', ':question'], ['2018', 'How to replace all occurrences of a string in JavaScript']);
//
console.log(replacedString);
  • 0
    Ваш код не работает, если слова имеют одинаковые буквы. Пример: var test = "Groups_4_Questions_0__Options_0_Wording" .replaceAll ([4, 0, 0], [100, 200, 300])
  • 0
    Не для этого. Только для уникальных сменных значений.
Показать ещё 1 комментарий
2

В поиске и замене первого элемента строки

var str = '[{"id":1,"name":"karthikeyan.a","type":"developer"}]'
var i = str.replace('"[','[').replace(']"',']');
console.log(i,'//first element search and replace')

В строке глобального поиска и замены

var str = '[{"id":1,"name":"karthikeyan.a","type":"developer"}]'
var j = str.replace(/\"\[/g,'[').replace(/\]\"/g,']');
console.log(j,'//global search and replace')
2

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

// Include a reference to the string.js library and call it (for example) S.
str = S(str).replaceAll('abc', '').s;
1

Я просто хочу поделиться своим решением, основанным на некоторых функциональных возможностях последних версий JavaScript:

   var str = "Test abc test test abc test test test abc test test abc";

   var result = str.split(' ').reduce((a, b) => {
      return b == 'abc' ? a : a + ' ' + b;   })

  console.warn(result)
1

Это можно решить с помощью регулярных выражений и флага g, что означает не останавливаться после поиска первого совпадения. Действительно, регулярные выражения - спасатели жизни!

function replaceAll(string, pattern, replacement) {
    return string.replace(new RegExp(pattern, "g"), replacement);
}

// or if you want myString.replaceAll("abc", "");

String.prototype.replaceAll = function(pattern, replacement) {
    return this.replace(new RegExp(pattern, "g"), replacement);
};
0

Способ 1

Попробуйте реализовать регулярное выражение

"Тест abc тест, тест abc тест, тест, тест abc, тест, тест abc".replace(/\ abc/g, '');

Способ 2

Разделить и присоединиться. Разделить с помощью abc и объединить с пустым пространством

"Test abc test abc test test test abc test test abc".split("abc"). Join ("")

0

Попробуйте следующее:

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

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

    return str;
};
-1

Вы можете попробовать так:

пример данных:

var text = "heloo,hai,hei"

text = text.replace(/[,]+/g,'')

или же

text.forEach(function(value){
  hasil = hasil.replace(',','')
})'''
  • 3
    Этому вопросу более 9 лет. Ваш ответ не приносит больше, чем уже было дано. Извините, но это не имеет значения сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню