JavaScript:RegExp 构造函数与 RegEx 文字

新手上路,请多包涵

我正在研究 RegExp 但到处都能看到两种语法

new RegExp("[abc]")

/[abc]/

如果使用修饰符,那么附加反斜杠的用途是什么( \

 /\[abc]/g

这两个我没有发现任何错误,但我想知道这两者之间有什么区别。如果是,那么它是什么,最好使用哪个?

我提到了 Differences between Javascript regexp literal and constructor 但我没有找到关于哪个最好以及有什么区别的解释。

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

阅读 362
2 个回答

关键区别在于文字 REGEX 不能接受动态输入,即来自变量,而构造函数可以,因为模式被指定为字符串。

假设您想匹配字符串中数组中的一个或多个单词:

 var words = ['foo', 'bar', 'orange', 'platypus'];
var str = "I say, foo, what a lovely platypus!";
str.match(new RegExp('\\b('+words.join('|')+')\\b', 'g')); //["foo", "platypus"]

这对于文字 /pattern/ 是不可能的,因为两个正斜杠之间的任何内容都按字面解释;我们必须在模式本身中指定允许的单词,而不是从动态源(数组)中读取它们。

另请注意,在以这种方式指定模式时需要双重转义(即 \\ )特殊字符,因为我们在字符串中这样做 - 第一个反斜杠必须由第二个转义,所以其中一个使它成为模式。如果只有一个,它将被 JS 的字符串解析器解释为转义字符,并被删除。

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

  1. 如您所见, RegExp 构造函数语法需要传递字符串。 \ 字符串中用来转义后面的字符。因此,
    new RegExp("\s") // This gives the regex `/s/` since s is escaped.

将生成正则表达式 s

注意: 要添加修饰符/标志,请将标志作为第二个参数传递给构造函数。

/\s/ 文字语法将产生可预测的正则表达式。

  1. RegExp 构造函数语法允许从动态创建正则表达式。

因此,当需要动态制作正则表达式时,请使用 RegExp 构造函数语法,否则使用正则表达式文字语法。

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

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