JavaScript:RegExp构造函数与RegEx文字

Gau*_*wal 22 javascript regex

我正在研究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的字符串解析器解释为转义字符,并被删除.

  • 但是请注意,文字语法只用JS代码编译一次,而`new Regexp()`表单必须在每次调用时编译正则表达式 - 因此使用文字版本时性能会更好:每当使用它时可能! (4认同)

Tus*_*har 8

  1. 如您所见,RegExp构造函数语法需要传递字符串.\在字符串中用于转义以下字符.从而,

    new RegExp("\s") // This gives the regex `/s/` since s is escaped.
    
    Run Code Online (Sandbox Code Playgroud)

    将产生正则表达式s.

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

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

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

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