2012-03-09 75 views
4

每次我看到相当多的文章或质疑说,只需使用:如何创建一个字符串“全部替换”功能?

str.replace(/yourstring/g, 'whatever'); 

但我想代替“yourstring”使用一个变量。然后人们说,只需使用new RegExp(yourvar, 'g')。这个问题是,yourvar可能包含特殊字符,我不希望它被视为一个正则表达式。

那么我们该怎么做到这一点呢?


示例输入:

'a.b.'.replaceAll('.','x') 

希望的输出:

'axbx' 
+0

你要这样对待像正则表达式正则表达式?你能定义你想提供的输入类型吗?你想要的是正则表达式的功能,还是仅仅是一串文字字符,“ABc34 * \ d/4h”'你想使用/替换? – 2012-03-09 21:53:45

+0

@DavidThomas:任何输入。我想要的只是一个简单的函数,它将“x”的所有*实例替换为“y”,而不仅仅是第一个,就像'string.replace'一样。 – mpen 2012-03-09 21:59:32

+1

''a.b.c'.split('。')。join('x')' – david 2012-03-09 22:14:39

回答

7

您可以拆分并加入。

var str = "this is a string this is a string this is a string"; 

str = str.split('this').join('that'); 

str; // "that is a string that is a string that is a string"; 
+0

这个解决方案似乎要快得多,所以你得到了检查,不会想到这么做,谢谢。 – mpen 2012-03-10 02:03:13

1

可以逃避你yourvar变量使用下面的方法:

function escapeRegExp(text) { 
    return text.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 
} 
+0

我认为你在反斜杠上有点过分。当在一个字符集里面时,你不需要逃避太多。尽管如此,这是一个可行的解决方案。 +1 – mpen 2012-03-09 22:02:07

1

XRegExp提供A F用于逃避字符串中的正则表达式字符:

var input = "$yourstring!"; 
var pattern = new RegExp(XRegExp.escape(input), "g"); 
console.log("This is $yourstring!".replace(pattern, "whatever")); 
// logs "This is whatever" 
+0

我并不是真的想要整个图书馆,所以我通过源代码挖掘出来:'n​​ativ.replace.call(str,/[-[\]{}()*+?.,\\^$|# \ s]/g,“\\ $ &");'图书馆的外观看起来很整齐 – mpen 2012-03-09 22:17:25

0

溶液1

RegExp.escape = function(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
} 

String.prototype.replaceAll = function(search, replace) { 
    return this.replace(new RegExp(RegExp.escape(search),'g'), replace); 
}; 

溶液2

'a.b.c.'.split('.').join('x'); 

jsPerf Test