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

新手上路,请多包涵

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

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

但我想做这样的事情:

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

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

原文由 JC Grubbs 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 611
2 个回答

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

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

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

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

原文由 Eric Wendelin 发布,翻译遵循 CC BY-SA 4.0 许可协议

正如 Eric Wendelin 提到的,你可以这样做:

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

这产生 "regex matching ." 。但是,如果 str1 是 "." ,它将失败。您希望结果为 "pattern matching regex" ,将句点替换为 "regex" ,但结果会是……

 regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

这是因为,虽然 "." 是一个字符串,但在 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"

原文由 Gracenotes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题