首页 文章

用于替换字符串中所有字符实例的最快方法

提问于
浏览
513

在JavaScript中替换字符串中所有字符串/字符实例的最快方法是什么?一个 while ,一个 for -loop,一个正则表达式?

13 回答

  • 6

    最简单的方法是使用带有 g 标志的正则表达式来替换所有实例:

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

    这将在字符串 str 中用 bar 替换所有出现的 foo . 如果你只有一个字符串,你可以将它转换为RegExp对象,如下所示:

    var pattern = "foobar",
        re = new RegExp(pattern, "g");
    
  • 9

    试试这个替换所有: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个测试 .

  • 6
    var mystring = 'This is a string';
    var newString = mystring.replace(/i/g, "a");
    

    newString现在是'Thas as a strang'

  • 29

    你也可以尝试:

    string.split('foo').join('bar');
    
  • 5

    您可以使用以下内容:

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

    要么

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

    这将取代所有不是字母或数字的字符('_') . 只需更改下划线值即可替换它 .

  • 6

    从速度问题考虑它我相信上面链接中提供的区分大小写的示例将是迄今为止最快的解决方案 .

    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将是“这是对紧急广播系统的测试 . ”

  • 79

    我认为真正的答案是它完全取决于你的输入是什么样的 . 我创建了一个JsFiddle来尝试一堆这些以及我自己的几个针对各种输入 . 无论我如何看待结果,我都看不到明显的赢家 .

    • RegExp也不是't the fastest in any of the test cases, but it wasn' .
      对于稀疏替换,

    • 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;
    }
    
  • 124

    什么是我不知道的最快,但我知道什么是最可读的 - 什么是最短和最简单的 . 即使它比其他解决方案稍慢,也值得使用 .

    所以使用:

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

    并享受良好的代码而不是更快(好吧...... 1/100000秒没有区别)和丑陋的代码 . ;)

  • 9

    像这样使用Regex对象

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

    它会将 " 的所有出现替换为 ' .

  • 2

    使用 String 对象的replace()方法 .

    如所选答案中所述,应在正则表达式中使用/ g标志,以替换字符串中子字符串的所有实例 .

  • 7

    我意识到我可能在接近10年前编写的这个实现实际上并没有完全发挥作用(在一个长期被遗忘的系统中讨厌的 生产环境 错误,并不总是这样的方式?),我尝试了其中一些建议 . ...我注意到的是我尝试的那些(我没有全部尝试过)与我的问题有同样的问题,也就是说,它们不会取代每一次出现,只有第一次出现,至少对我的测试案例而言将“test .... txt”改为“test.txt”,将“..”改为“ . ”......也许我错过了正则表达式的情况?但我离题了......

    所以,我重写了我的实现如下 . 这很简单,虽然我怀疑不是最快,但我也不认为这种差异会影响现代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;
    
    }
    

    希望有人帮助!

  • 907
    // Find, Replace, Case
    // i.e "Test to see if this works? (Yes|No)".replaceAll('(Yes|No)', 'Yes!');
    // i.e.2 "Test to see if this works? (Yes|No)".replaceAll('(yes|no)', 'Yes!', true);
    String.prototype.replaceAll = function(_f, _r, _c){ 
    
      var o = this.toString();
      var r = '';
      var s = o;
      var b = 0;
      var e = -1;
      if(_c){ _f = _f.toLowerCase(); s = o.toLowerCase(); }
    
      while((e=s.indexOf(_f)) > -1)
      {
        r += o.substring(b, b+e) + _r;
        s = s.substring(e+_f.length, s.length);
        b += e+_f.length;
      }
    
      // Add Leftover
      if(s.length>0){ r+=o.substring(o.length-s.length, o.length); }
    
      // Return New String
      return r;
    };
    
  • 0

    @Gumbo添加了额外的答案 - user.email.replace(/ foo / gi,“bar”);

    /foo/g - Refers to the all string to replace matching the case sensitive
    
    /foo/gi - Refers to the without case sensitive and replace all For Eg: (Foo, foo, FoO, fOO)
    

    DEMO

相关问题