2011-11-01 148 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); 
相關問題