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

用JavaScript替换字符串中所有字符串/字符实例的最快方法是什么?A while,- for循环,正则表达式?

樱十三2020/03/11 17:45:46

@Gumbo adding extra answer - 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

阳光乐2020/03/11 17:45:46

使用对象replace()方法String

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

凯番长蛋蛋2020/03/11 17:45:46

我认为真正的答案是,这完全取决于您输入的内容。我创建了一个JsFiddle来尝试一堆这样的应用程序,以及我自己的一些应用程序,以用于各种输入。无论我如何看待结果,都看不到明确的赢家。

  • RegExp在所有测试用例中都不是最快的,但也不错。
  • 对于稀疏替换,拆分/合并方法似乎最快。
  • 我写的这篇文章对于小投入和密集替换似乎最快:

    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;
    }
    
Itachi神乐2020/03/11 17:45:46

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

因此使用:

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

并且享受优质的代码,而不是更快(好吧... 1/100000秒没什么区别)和丑陋的代码。;)

Sam小哥逆天2020/03/11 17:45:46

在意识到我大概在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;

}

希望能帮助到某人!

飞云前端西门2020/03/11 17:45:46

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

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

EvaLEY2020/03/11 17:45:46

尝试以下replaceAll: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!!!

Let me know if you can break it, or you have something better, but make sure it can pass these 4 tests.

LEva卡卡西2020/03/11 17:45:46

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

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

这将替换所有出现的foobar字符串中str如果只有一个字符串,则可以将其转换为RegExp对象,如下所示:

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