协慌网

登录 贡献 社区

如何在正则表达式中使用变量?

我想在 JavaScript 中创建一个String.replaceAll()方法,我认为使用正则表达式将是最简洁的方法。但是,我无法弄清楚如何将变量传递给正则表达式。我已经可以做到这一点,它将用"A"替换所有"B"的实例。

"ABABAB".replace(/B/g, "A");

但我想做这样的事情:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

但显然这只会替换文本"replaceThis" ... 所以如何将此变量传递给我的正则表达式字符串?

答案

您可以构造一个新的RegExp对象,而不是使用/regex/g语法:

var replace = "regex";
var re = new RegExp(replace,"g");

您可以通过这种方式动态创建正则表达式对象。然后你会做:

"mystring".replace(re, "newstring");

正如 Eric Wendelin 所说,你可以这样做:

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

这产生"regex matching ." 。但是,如果 str1 是"." ,它将失败"." 。你期望结果是"pattern matching regex" ,用"regex"替换句号,但它会变成......

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

这是因为,虽然"."是一个 String,在 RegExp 构造函数中,它仍然被解释为正则表达式,意味着任何非换行符,表示字符串中的每个字符。为此,以下功能可能有用:

RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

然后你可以这样做:

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

产生"pattern matching regex"

"ABABAB".replace(/B/g, "A");

一如既往:除非必须,否则不要使用正则表达式。对于简单的字符串替换,成语是:

'ABABAB'.split('B').join('A')

那么你不必担心 Gracenotes 答案中提到的引用问题。