【问题标题】:Differences between Javascript regexp literal and constructorJavascript regexp 文字和构造函数之间的区别
【发布时间】:2011-11-01 10:05:46
【问题描述】:

我们最近遇到了一个错误,在一位开发人员将 RegExp 文字更改为构造函数调用之后,我想知道为什么会有任何差异。 确切的代码是

var parts = new RegExp("/rt:([^@]+)@(\d+)/").exec(tag);

对比原版

var parts = /rt:([^@]+)@(\d+)/.exec(tag);

tagrt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077 时,第一个(错误)调用返回null,而第二个调用返回["rt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]

不用说,我恢复了更改,但我想知道为什么会有这样的差异。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    有两个问题:

    /不是表达式的一部分。它们是分隔符,标记正则表达式文字。如果您使用RegExp,则必须将它们删除,否则它们会匹配斜线。

    其次,反斜杠是字符串文字中的转义字符。要为表达式创建文字 \,您必须在字符串中对其进行转义。

    因此,等价于:

    new RegExp("rt:([^@]+)@(\\d+)")
    

    如果您想使用RegExp,特别是转义会使表达式更难编写。实际上,仅当您要动态创建表达式时才需要它,也就是说,例如,如果您要包含存储在变量中的文本。如果你有一个固定的表达式,文字 /.../ 更容易写,也更简洁。

    【讨论】:

    • 好答案,我想我会删除我的!如果你需要重用一个特定的 RegExp 怎么办——这不是使用构造函数的好时机吗?还是说var resuasableRegex = /..pattern../;
    • @ElRonnoco:确实,您也可以将正则表达式文字分配给变量。
    • 感谢您的信息。下次我会更好地研究字符串,以确保不需要转义字符。无论如何,文字肯定要容易得多。
    • 对于小型正则表达式,文字绝对是要走的路。如果您要维护动态表达式或很长的正则表达式,RegExp 是一个不错的选择。转义还不错:只需“将 [literal] 反斜杠加倍并转义引号” Javascript - The Good Parts,p。 71. 这里的代码只会得到引号:function escape(text) { return text.replace(/['"]/g, "\\$&"); };
    【解决方案2】:

    \d 在传递给new RegExp 构造函数时需要转义。所以,应该是

    var parts = new RegExp("rt:([^@]+)@(\\d+)").exec(tag);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 2012-08-25
      • 2011-09-30
      • 1970-01-01
      • 2015-06-05
      • 2013-09-09
      • 2015-02-23
      相关资源
      最近更新 更多