Javascript regexp 字面量和构造函数之间的差异

IT技术 javascript regex
2021-02-06 00:07:30

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

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

vs 原来的

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

tag是,例如rt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077,第一(童车)调用返回null,而第二个返回["rt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]

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

2个回答

有两个问题:

/表达的一部分。它们是delimiters,标记正则表达式文字。如果您使用RegExp它们必须被删除,否则它们会从字面上匹配斜杠。

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

因此,等价物将是:

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

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

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

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

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