JavaScript:RegExp构造函数与RegEx文字

wb1gzix0  于 2023-06-25  发布在  Java
关注(0)|答案(4)|浏览(93)

我正在学习RegExp,但到处都能看到两种语法

new RegExp("[abc]")

然后呢

/[abc]/

如果有修饰符,那么额外的反斜杠(\)有什么用?

/\[abc]/g

我没有得到任何错误与这两个,但我想知道有没有任何区别,这两个。如果是,那么它是什么,最好使用什么?
我提到了Differences between Javascript regexp literal and constructor,但我没有找到一个解释,哪一个是最好的,有什么区别。

a8jjtwal

a8jjtwal1#

关键的区别在于文字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的字符串解析器解释为转义字符,并被删除。

nx7onnlm

nx7onnlm2#

1.正如您所看到的,RegExp构造函数语法要求传递字符串。字符串中的\用于转义以下字符。因此,在本发明中,

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

将生成正则表达式s

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

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

  1. RegExp构造函数语法允许从动态创建正则表达式。
    因此,当需要动态地创建正则表达式时,请使用RegExp构造函数语法,否则使用正则表达式语法。
wmomyfyw

wmomyfyw3#

它们是一样的,但是**“在可能的情况下应该使用正则表达式”**,因为它更容易阅读,并且不需要像字符串字面量那样进行转义。
逃逸示例:

new RegExp("\\d+");

正则表达式字面量**(推荐)**:

/\d+/;
  • 当模式是动态计算的时候,使用RegExp构造函数是合适的,例如如果是用户提供的 *

来源SonarLint Rule

vfwfrxfs

vfwfrxfs4#

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

  • 通过对象构造函数
  • 可以在运行时更改。
  • 通过文字。
  • 在加载脚本时编译
  • 更好的性能

字面量最适合与已知的正则表达式一起使用,而构造函数更适合于动态构造的正则表达式,例如来自用户输入的正则表达式。
您可以使用两者中的任何一个,它们将以完全相同的方式处理。

相关问题