var re1 = /\d+\.\d+/; alert(re1);//結果是 /\d+\.\d+/ 和聲明的正則re1一樣 /*這里的 n(n>0)個數字 符號點 n(n>0)個數字 既:9.9、12.134、56362.151415 等 */ var str1 = '134.32'; alert(re1.test(str1));//true
/*接下來
我們根據感覺改成用new RegExp聲明正則*/
var re2 = new RegExp('\d+\.\d+'); alert(re2);//結果 /d+.d+/
//根據我們彈出的 正則表達式/d+.d+/分析
/*可見輸出的結果並不是我們想要的正則表達式,這個表達式的意思:
d+表示 n(n>0)個d
.表示匹配除換行符意外的任意字符
后邊d+表示 n(n>0)個d。
既 d.d 、dd.dd 、dad、ddydd 等
*/
var str2 = 'ddyd'; alert(re2.test(str2));//true
那么
問題出在了哪里,我們來分析一下,我們都知道正則表達式它本質上
也是一個字符串,但是功能比一般的字符串要強很多,所以可以稱作是
超級字符串。我們在用new RegExp('正則')聲明正則表達式的時候,
可以看出是用引號包着的,我們都知道在js里,' '引號可以用來聲明
字符串(/ / 用來聲明正則)。所以這里更可以看出是正則表達式也
是字符串了。
而在字符串里 反斜杠\是有特殊含義的,就是用來轉移字符。
所以我們我們上面寫的new RegExp('\d+\.\d+');就有問題了。
本來我們是想用\d表示匹配任意的數字的。配合元字符+后有n(n>0)
個數字的。
因為反斜杠\有轉義的意思所上面的
\d 被轉義成了d
\. 被轉義成了. (.點在正則中表示匹配除換行符以外的
任意字符)
所以被引號包着的正則表達式字符串'\d+\.\d+'被轉換成真正
的正則表達式之后就成了/d+.d+/
所以就有了上面描述的現象。
/*既然如此我們只要合理的利用轉義字符反斜杠\,就可以使用
new RegExp('')聲明的正則和直接用 / / 聲明的正則達到一樣的效
果。
思路:
1.確定我們想要的正則表達式:/\d+\.\d+/
【注】兩邊的斜杠 / 是用來聲明正則的,里面的內容\d+\.\d+是
表達式的式子,式子和 斜杠/合起來才叫正則表達式
2.把正則表達式的式子放到引號(字符串)里'\d+\.\d+',很明顯這樣是不
行的,里面的反斜杠\被當成了用來轉義標識,所以我們要把 再加一個
\,即:'\\d+\\.\\d+'這樣第一個反斜杠\就把第二個反斜杠\轉成了反斜杠\
這樣這個字符串''正則,轉換成斜杠/ / 正則的時候就成了我們想要的/ \d+\.\d+/了。
*/
//下面我們進行測試一下
var re3 = new RegExp('\\d+\\.\\d+'); alert(re3);//結果 /\d+\.\d+/ var str3 = '32.1'; alert (re3.test(str3)); //true
/*可以看出現在達到里我們向要的效果,從alert(re3);得到的結果/\d+\.\d+/就可以看出沒錯了。
轉義標識反斜杠\在通過new RegExp('\\d+\\.\\d+')聲明的正則和 / /聲明的正則中都內轉義,
在/\d+\.\d+/這里邊為什么沒有把\d轉成d?
因為/\d+\.\d+/這種形式就是正則表達式的形式,而在正則表達式里有明文規定\d這種寫法代
表的意思,所以在執行正則表達式的時候遇到反斜杠\后,一看后面還有個d自然就不轉義。(\d這
種具有特殊含義的字符叫做元字符)。
但是通過new RegExp 加字符串'';聲明的,因為這些有特殊含義的字符在字符串里他們並不認為
有特殊含義。所以要多加一個\,這樣等轉換成斜杠/ /方式的時候還有一個反斜杠\.*/
/*在這里我們再附加一個小例子
用new的方式聲明正則表達式。可以匹配字符串hello,e和l之間有n(n>0)個+號;
*/
var re4 = new RegExp('he\\++llo'); /*第一個\是轉義標識負責把第二\轉換成符號\ 然而在/he\++llo/里\又成了一個轉義標識,他把后面的+從正則表達式的重復字符變成了 純符號+,緊隨其后的+因為沒有轉義,所以它是正則的重復字符,多以他代表有n(n>0)個 前面的符號+*/ alert(re4); //結果 /he\++llo/ var str4 = 'he+++++llo'; alert(re4.test(str4));//true