当我想要替换字符串的某些部分时,我应该直接调用replace吗?
var r1 = /"\+((:?[\w\.]+)(:?(:?\()(:?.*?)(:?\))|$){0,1})\+"/g;
arg = arg.replace(r1, function(outer, inner){
return eval(inner);
});
或者首先测试一个匹配,然后替换它是否是一个匹配,像这样?
var r1 = /"\+((:?[\w\.]+)(:?(:?\()(:?.*?)(:?\))|$){0,1})\+"/g;
if (r1.test(arg)) {
arg = arg.replace(r1, function(outer, inner){
return eval(inner);
});
}
我想这可以归结为string.replace(regex,string)函数的工作原理。即使没有匹配,它会进入我的回调,还是只返回arg?在这种情况下,我假设直接调用替换是正确的方法,以避免正则表达式引擎匹配字符串两次?
答案 0 :(得分:4)
您不必使用test
。 replace
中的函数仅在匹配发生时执行。
另外,你为什么使用eval? eval
执行参数,就像它是一个JavaScript表达式一样。由于您知道输入格式,因此您很可能在没有eval的情况下实现相同的行为。