Самый быстрый метод для замены всех экземпляров символа в строке - PullRequest
567 голосов
/ 22 января 2010

Какой самый быстрый способ заменить все вхождения строки / символа в строке в JavaScript? A while, for -петл, регулярное выражение?

Ответы [ 13 ]

988 голосов
/ 22 января 2010

Проще всего было бы использовать регулярное выражение с флагом g для замены всех экземпляров:

str.replace(/foo/g, "bar")

Это заменит все вхождения foo на bar в строке str. Если у вас есть только строка, вы можете преобразовать ее в объект RegExp следующим образом:

var pattern = "foobar",
    re = new RegExp(pattern, "g");
130 голосов
/ 16 июля 2011

Попробуйте это заменитьВсе: http://dumpsite.com/forum/index.php?topic=4.msg8#msg8

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

Это очень быстро, и он будет работать для всех этих условий что многие другие терпят неудачу:

"x".replaceAll("x", "xyz");
// xyz

"x".replaceAll("", "xyz");
// xyzxxyz

"aA".replaceAll("a", "b", true);
// bb

"Hello???".replaceAll("?", "!");
// Hello!!!

Дайте мне знать, если вы можете сломать его, или у вас есть что-то лучше, но убедитесь, что он может пройти эти 4 теста.

79 голосов
/ 22 января 2010
var mystring = 'This is a string';
var newString = mystring.replace(/i/g, "a");

newString теперь 'Thas as strang'

35 голосов
/ 26 декабря 2015

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

string.split('foo').join('bar');
11 голосов
/ 04 марта 2014

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

var token = "\r\n";
var newToken = " ";
var oldStr = "This is a test\r\nof the emergency broadcasting\r\nsystem.";
newStr = oldStr.split(token).join(newToken);

newStr будет «Это тест системы аварийного вещания».

10 голосов
/ 22 февраля 2013

Вы можете использовать следующее:

newStr = str.replace(/[^a-z0-9]/gi, '_');

или

newStr = str.replace(/[^a-zA-Z0-9]/g, '_');

Это заменит все символы, которые не являются буквой или цифрой ('_'). Просто измените значение подчеркивания на то, что вы хотите заменить.

9 голосов
/ 31 июля 2016

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

  • RegExp не был самым быстрым ни в одном из тестовых случаев, но он также не был плохим.
  • Подход Split / Join кажется наиболее быстрым для редких замен.
  • Этот, который я написал, кажется самым быстрым для небольших входов и плотных замены:

    function replaceAllOneCharAtATime(inSource, inToReplace, inReplaceWith) {
        var output="";
        var firstReplaceCompareCharacter = inToReplace.charAt(0);
        var sourceLength = inSource.length;
        var replaceLengthMinusOne = inToReplace.length - 1;
        for(var i = 0; i < sourceLength; i++){
            var currentCharacter = inSource.charAt(i);
            var compareIndex = i;
            var replaceIndex = 0;
            var sourceCompareCharacter = currentCharacter;
            var replaceCompareCharacter = firstReplaceCompareCharacter;
            while(true){
                if(sourceCompareCharacter != replaceCompareCharacter){
                output += currentCharacter;
                break;
            }
            if(replaceIndex >= replaceLengthMinusOne) {
                i+=replaceLengthMinusOne;
                output += inReplaceWith;
                //was a match
                break;
            }
            compareIndex++; replaceIndex++;
            if(i >= sourceLength){
                // not a match
                break;
            }
            sourceCompareCharacter = inSource.charAt(compareIndex)
                replaceCompareCharacter = inToReplace.charAt(replaceIndex);
            }   
            replaceCompareCharacter += currentCharacter;
        }
        return output;
    }
    
7 голосов
/ 15 октября 2013

Используйте объект Regex, как этот

var regex = new RegExp('"', 'g'); str = str.replace(regex, '\'');

Он заменит все вхождения " в '.

5 голосов
/ 13 июня 2012

Я попробовал некоторые из этих предложений после того, как понял, что реализация, которую я написал об этом, вероятно, около 10 лет назад, на самом деле не работала полностью (неприятная ошибка в работе системы, о которой давно забыли, не всегда так ?!) ... я заметил, что те, которые я пробовал (я не пробовал их все), имели ту же проблему, что и моя, то есть они не заменяли КАЖДЫЙ случай, только первый, по крайней мере для моего контрольный пример получения "test .... txt" до "test.txt" путем замены ".." на "." ... может быть, я пропустил так regex ситуацию? Но я отвлекся ...

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

function replaceSubstring(inSource, inToReplace, inReplaceWith) {

  var outString = inSource;
  while (true) {
    var idx = outString.indexOf(inToReplace);
    if (idx == -1) {
      break;
    }
    outString = outString.substring(0, idx) + inReplaceWith +
      outString.substring(idx + inToReplace.length);
  }
  return outString;

}

Надеюсь, это кому-нибудь поможет!

5 голосов
/ 22 января 2010

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

Так что используйте:

 "string".replace("a", "b");
 "string".replace(/abc?/g, "def");

И наслаждайтесь хорошим кодом вместо более быстрого (ну ... 1/100000 сек. - не разница) и безобразного ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...