最快的方法来替换字符串中的所有字符的实例
什么是最快的方式来取代一个string/character
中的string/character
在Javascript
中的所有实例? while
,一个for-loop
,一个regular expression
?
最简单的方法是使用带g
标志的正则表达式来替换所有的实例:
str.replace(/foo/g, "bar")
这将在字符串str
替换所有出现的foo
与bar
。 如果你只有一个字符串,你可以把它转换成一个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; };