用正则表达式替换匹配

时间:2016-10-10 14:22:37

标签: javascript regex replace

我正在尝试替换美元符号之间的文本匹配。

因此$match$内的文字Some text and $some text that matches$.应该被替换。

我试过了

text.replace(/\$.*?\$/g, function (match) {
  return '_' + match + '_';
}

这很有效。问题是我想在这个函数中评估匹配,但有时评估不起作用,在这些情况下我只想返回原始匹配。所以它就像

text.replace(/\$.*?\$/g, function (match) {
  try {
    return evaluate(match);
  } catch (e) {
    return match;
  }
}

但是使用我当前的正则表达式,匹配包含原始文本中的美元符号。我希望它省略美元符号,但如果评估失败,那么我希望原来的美元符号回来。

我能做的是

text.replace(/\$.*?\$/g, function (match) {
  try {
    return evaluate(match.replace(/\$/g, ''));
  } catch (e) {
    return match;
  }
}

但是不是更优雅的方式吗?

1 个答案:

答案 0 :(得分:1)

这样的事情可能会:

const evaluate = function(str) {
    if (str && str.startsWith("t")) {return str.toUpperCase();}
    throw "Gotta hava a 'T'";
};

"ab$test$cd $something$ that is $tricky$.".replace(/\$([^$]*)\$/g;, function(str, match) {
    try {
        return evaluate(match);
    } catch(e) {
        return str;
    }
}); //=> "abTESTcd $something$ that is TRICKY."

但我同意评论,你可能最好从undefined返回一个不同的信号(nullevaluate?)而不是投掷此案例。然后函数体可能就像:

        return evaluate(match) || str;

要点是正则表达式中的捕获组:/\$([^$]*)\$/g;,它将成为替换函数的参数。