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

什么是最快的方式来取代一个string/character中的string/characterJavascript中的所有实例? while ,一个for-loop ,一个regular expression

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

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

这将在字符串str替换所有出现的foobar 。 如果你只有一个字符串,你可以把它转换成一个RegExp对象,像这样:

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

试试这个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!!! 

让我知道如果你能打破它,或者你有更好的东西,但确保它可以通过这4个测试。

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

newString现在是'Thas as a strang'

你也可以尝试:

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

您可以使用以下内容:

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

要么

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

这将取代所有不是字母或数字的字符('_')。 简单的改变下划线的值,无论你想取代它。

考虑到速度问题,我相信上面的链接中提供的区分大小写的例子将是最快的解决方案。

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

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

所以使用:

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

并享受良好的代码,而不是更快(呃… 1/100000秒不是一个差异)和丑陋的一个。 ;)

我意识到我写的这个实现可能接近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; } 

希望帮助别人!

像这样使用Regex对象

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

它将取代所有发生的"'

我认为真正的答案是完全取决于你的投入是什么样子。 我创建了一个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; } 

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

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

 // Find, Replace, Case // ie "Test to see if this works? (Yes|No)".replaceAll('(Yes|No)', 'Yes!'); // ie2 "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; };