我正在研究RegExp,但到处都可以看到两种语法
new RegExp("[abc]")
Run Code Online (Sandbox Code Playgroud)
和
/[abc]/
Run Code Online (Sandbox Code Playgroud)
如果使用修饰符那么使用额外的斜杠(\)
/\[abc]/g
Run Code Online (Sandbox Code Playgroud)
我对这两个没有任何错误,但我想知道这两个有什么区别.如果是,那么它是什么,最好使用哪个?
我提到了Javascript regexp文字和构造函数之间的差异,但在那里我没有找到解释哪个是最好的,哪个是有区别的.
Utk*_*nos 34
关键的区别在于,文字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'));
Run Code Online (Sandbox Code Playgroud)
对于文字来说这是不可能的/pattern/,因为两个正斜杠之间的任何内容都是按字面解释的.
还要注意\\在以这种方式指定模式时需要双重转义(即)特殊字符,因为我们在字符串中这样做 - 第一个反斜杠必须由第二个反转,因此其中一个使其成为模式.如果只有一个,它将被JS的字符串解析器解释为转义字符,并被删除.
如您所见,RegExp构造函数语法需要传递字符串.\在字符串中用于转义以下字符.从而,
new RegExp("\s") // This gives the regex `/s/` since s is escaped.
Run Code Online (Sandbox Code Playgroud)
将产生正则表达式s.
注意:要添加修饰符/标志,请将标志作为第二个参数传递给构造函数.
虽然,/\s/- 字面语法,将产生可预测的正则表达式.
该RegExp构造函数语法允许从动态创建的正则表达式.
因此,当正则表达式需要动态制作时,请使用RegExp构造函数语法,否则使用正则表达式文字语法.