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

时间:2011-11-01 10:05:47

标签: javascript regex

我们最近有一个错误,在一位开发人员将一个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"]

毋庸置疑,我恢复了这一变化,但我想知道为什么首先会出现这样的差异。

2 个答案:

答案 0 :(得分:36)

有两个问题:

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

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

因此,等价物将是:

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

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

答案 1 :(得分:4)

传递给\d构造函数时,

new RegExp需要进行转义。所以,它需要

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