JavaScript:RegExp构造函数与RegEx文字

时间:2016-04-28 10:29:24

标签: javascript regex

我正在研究RegExp,但到处都可以看到两种语法

new RegExp("[abc]")

/[abc]/

如果使用修饰符,那么使用额外的斜杠(\

是什么用法
/\[abc]/g

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

我提到了Differences between Javascript regexp literal and constructor,但在那里我没有找到解释哪个是最好的,哪个是有区别的。

3 个答案:

答案 0 :(得分:23)

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

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

var words = ['foo', 'bar', 'orange', 'platypus'];
var str = "Foo something nice orange what a lovely platypus";
str.match(new RegExp('\\b('+words.join('|')+')\\b'));

对于文字/pattern/,这是不可能的,因为两个正斜杠之间的任何内容都是按字面解释的。

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

答案 1 :(得分:7)

  1. 如您所见,RegExp构造函数语法要求传递字符串。字符串中的\用于转义后续字符。因此,

    new RegExp("\s") // This gives the regex `/s/` since s is escaped.
    

    将生成正则表达式s

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

    虽然/\s/ - 文字语法,但会产生可预测的正则表达式。

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

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

答案 2 :(得分:-1)

有两种方法可以定义正则表达式。

  1. 通过对象构造函数
    • 可以在运行时更改。
  2. 通过字面意思。
    • 在加载脚本时编译
    • 更好的表现
  3. 文字最适合使用已知的正则表达式,而构造函数更适合动态构造的正则表达式,例如来自用户输入的正则表达式。

    你可以使用这两种中的任何一种,它们将以完全相同的方式处理..