在同一个开发人员将RegExp字面量更改为构造函数调用后,我们最近遇到了一个错误,我想知道为什么根本没有区别。确切的代码是
var parts = new RegExp("/rt:([^@]+)@(\d+)/").exec(tag);
与原始的
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"]
tag
rt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077
null
["rt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]
不用说,我撤消了更改,但是我想知道为什么首先会有如此不同。
有两个问题:
的/是 不 表达的一部分。它们是 分隔符 ,标记了正则表达式文字。如果使用则必须将其删除RegExp,否则它们在字面上会匹配一个斜杠。
/
RegExp
其次,反斜杠是字符串文字中的转义字符。要\为表达式创建文字,您必须在字符串中对其进行转义。
\
因此,等效项为:
new RegExp("rt:([^@]+)@(\\d+)")
如果要使用表达式,转义尤其会使表达式难以编写RegExp。实际上,仅当您要动态创建表达式时才需要它,也就是说,例如要包含存储在变量中的文本。如果您有固定的表达式,则文字/.../更容易编写且更简洁。
/.../