我应该在string.replace之前使用regexp.test吗?

时间:2011-11-01 08:30:12

标签: javascript regex

当我想要替换字符串的某些部分时,我应该直接调用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?在这种情况下,我假设直接调用替换是正确的方法,以避免正则表达式引擎匹配字符串两次?

1 个答案:

答案 0 :(得分:4)

您不必使用testreplace中的函数仅在匹配发生时执行。

  • 无匹配:无功能(eval)呼叫
  • 1匹配:1通话
  • 2场比赛:2场比赛

另外,你为什么使用eval? eval执行参数,就像它是一个JavaScript表达式一样。由于您知道输入格式,因此您很可能在没有eval的情况下实现相同的行为。