我正在研究RegExp,但到处都可以看到两种语法
new RegExp("[abc]")
和
/[abc]/
如果使用修饰符,那么使用额外的斜杠(\
)
/\[abc]/g
我对这两个没有任何错误,但我想知道这两个有什么区别。如果是,那么它是什么,哪个最好用?
我提到了Differences between Javascript regexp literal and constructor,但在那里我没有找到解释哪个是最好的,哪个是有区别的。
答案 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)
如您所见,RegExp
构造函数语法要求传递字符串。字符串中的\
用于转义后续字符。因此,
new RegExp("\s") // This gives the regex `/s/` since s is escaped.
将生成正则表达式s
。
注意:添加修饰符/标志,将标志作为第二个参数传递给构造函数。
虽然/\s/
- 文字语法,但会产生可预测的正则表达式。
RegExp
构造函数语法允许动态创建正则表达式。
因此,当需要动态制作正则表达式时,请使用RegExp
构造函数语法,否则使用正则表达式文字语法。
答案 2 :(得分:-1)
有两种方法可以定义正则表达式。
文字最适合使用已知的正则表达式,而构造函数更适合动态构造的正则表达式,例如来自用户输入的正则表达式。
你可以使用这两种中的任何一种,它们将以完全相同的方式处理..