Javascript正则表达式字面量和构造函数之间的区别

Differences between Javascript regexp literal and constructor

本文关键字:构造函数 之间 区别 正则表达式 Javascript      更新时间:2023-09-26

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

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

的原件
var parts = /rt:([^@]+)@('d+)/.exec(tag);

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

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

有两个问题:

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

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

因此,等效的是:
new RegExp("rt:([^@]+)@(''d+)")

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

'd传递给new RegExp构造函数时需要转义。所以它必须是

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