2011-11-01 111 views
17

最近我们遇到了一个错误,在一个开发人员将一个RegExp文字变成了一个构造函数调用之后,我想知道为什么有什么区别。 确切代码是Javascript正则表达式文字和构造函数的区别

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

VS的

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

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

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

回答

33

有两个问题:

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

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

因此,相当于将是:

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

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

+0

很好的答案,想我会删除我的!如果你需要重用一个特定的RegExp会怎么样 - 是不是使用构造函数的好时机?或者你会说'var resuasableRegex =/.. pattern ../;'? –

+0

@ElRonnoco:的确,您也可以为变量指定一个正则表达式。 –

+0

感谢您的信息。下次我会更好地研究这些字符串,以确保不需要转义字符。 无论如何,文字确实容易得多。 –

4

\d当传递给new RegExp构造函数时需要被转义。因此,它需要

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