我正在学习RegExp,但到处都能看到两种语法
new RegExp("[abc]")
然后呢
/[abc]/
如果有修饰符,那么额外的反斜杠(\
)有什么用?
/\[abc]/g
我没有得到任何错误与这两个,但我想知道有没有任何区别,这两个。如果是,那么它是什么,最好使用什么?
我提到了Differences between Javascript regexp literal and constructor,但我没有找到一个解释,哪一个是最好的,有什么区别。
我正在学习RegExp,但到处都能看到两种语法
new RegExp("[abc]")
然后呢
/[abc]/
如果有修饰符,那么额外的反斜杠(\
)有什么用?
/\[abc]/g
我没有得到任何错误与这两个,但我想知道有没有任何区别,这两个。如果是,那么它是什么,最好使用什么?
我提到了Differences between Javascript regexp literal and constructor,但我没有找到一个解释,哪一个是最好的,有什么区别。
4条答案
按热度按时间a8jjtwal1#
关键的区别在于文字REGEX不能接受动态输入,即而构造函数可以,因为模式被指定为字符串。
假设你想匹配一个字符串中数组中的一个或多个单词:
这对于文字
/pattern/
是不可能的,因为两个正斜杠之间的任何内容都按字面解释;我们必须在模式本身中指定允许的单词,而不是从动态源(数组)中阅读它们。还需要注意双转义(即
\\
)特殊字符,因为我们是在字符串中这样做的-第一个反斜杠必须被第二个转义,这样其中一个才能进入模式。如果只有一个,它将被JS的字符串解析器解释为转义字符,并被删除。nx7onnlm2#
1.正如您所看到的,
RegExp
构造函数语法要求传递字符串。字符串中的\
用于转义以下字符。因此,在本发明中,将生成正则表达式
s
。**注意:**要添加修饰符/标志,将标志作为第二个参数传递给构造函数。
而
/\s/
-字面语法,将产生可预测的正则表达式。RegExp
构造函数语法允许从动态创建正则表达式。因此,当需要动态地创建正则表达式时,请使用
RegExp
构造函数语法,否则使用正则表达式语法。wmomyfyw3#
它们是一样的,但是**“在可能的情况下应该使用正则表达式”**,因为它更容易阅读,并且不需要像字符串字面量那样进行转义。
逃逸示例:
正则表达式字面量**(推荐)**:
来源SonarLint Rule。
vfwfrxfs4#
有两种方法定义正则表达式。
字面量最适合与已知的正则表达式一起使用,而构造函数更适合于动态构造的正则表达式,例如来自用户输入的正则表达式。
您可以使用两者中的任何一个,它们将以完全相同的方式处理。