我沒有看到創建一個新的RegExp對象或使用/.../
之間的區別,因爲如果我執行下面我得到:我的正則表達式不起作用
真的假
alert(/^\d{4}$/.test(obj.value)+" "+(new RegExp("^\d{4}$")).test(obj.value));
感謝advance
我沒有看到創建一個新的RegExp對象或使用/.../
之間的區別,因爲如果我執行下面我得到:我的正則表達式不起作用
真的假
alert(/^\d{4}$/.test(obj.value)+" "+(new RegExp("^\d{4}$")).test(obj.value));
感謝advance
當您從字符串創建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構造函數的字符串中的\
加倍,可以確保單個\
能夠存活到正則表達式實際解釋的位置。當您使用「原生」正則表達式語法(/.../
)時,您只需要一個\
,因爲正則表達式僅解析一次。
你期待什麼? – adeneo