我正在尝试替换美元符号之间的文本匹配。
因此$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;
}
}
但是不是更优雅的方式吗?
答案 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
返回一个不同的信号(null
?evaluate
?)而不是投掷此案例。然后函数体可能就像:
return evaluate(match) || str;
要点是正则表达式中的捕获组:/\$([^$]*)\$/g;
,它将成为替换函数的参数。