2013-07-13 20 views
0

我沒有看到創建一個新的RegExp對象或使用/.../ 之間的區別,因爲如果我執行下面我得到:我的正則表達式不起作用

真的假

alert(/^\d{4}$/.test(obj.value)+" "+(new RegExp("^\d{4}$")).test(obj.value)); 

感謝advance

+2

你期待什麼? – adeneo

回答

4

當您從字符串創建RegExp對象時,必須考慮到字符串常量語法(如RegExp語法)將\視爲特殊字符的事實:

alert(/^\d{4}$/.test(obj.value)+" "+(new RegExp("^\\d{4}$")).test(obj.value)); 

應該會更好。請注意字符串版本中的\\,而不是單個\

,當你有像

var myRegExp = new RegExp("blah blah \d blah blah"); 

什麼去?首先,解析器必須查看錶達式的低槓桿部分,如變量名稱,=符號,new等。字符串常量是表達式的低級基本元素之一。解析器必須將該字符串的源代碼轉換爲運行時字符串值,並且需要讀取引號之間的字符。 \d在那裏將意味着—到字符串部分解析器,記得—該字符串應該包含一個「d」。 (「d」字符並不特殊,所以\d真的不會在字符串中做任何有趣的事情,但\將被「吃掉」。)

所以現在我們已經有了基本的構建塊表達式,所以在運行時,RegExp構造函數可以用分析器組裝的字符串值來調用。現在,是時候進行RegExp語法分析了。 RegExp解析器現在不會看到\d,因爲\在字符串常量的構造期間消失了。

因此,通過將傳遞給RegExp構造函數的字符串中的\加倍,可以確保單個\能夠存活到正則表達式實際解釋的位置。當您使用「原生」正則表達式語法(/.../)時,您只需要一個\,因爲正則表達式僅解析一次。