一、簡(jiǎn)單模式 1.元字符 這里是正則表達(dá)式用到的所有元字符 ( [ { \ ^ $ | ) ? * + . 任何時(shí)候要在正則表達(dá)式中使用這些元字符,都必須對(duì)它們進(jìn)行轉(zhuǎn)義。因此要匹配一個(gè)問號(hào),正則表達(dá)式就該這樣表示: var veQMark =/\?/; 或者這樣表示: var veQMark=new RegExp("\\?"); 注意當(dāng)正則表達(dá)式以第二種形式表示時(shí),所有的反斜杠都必須用兩個(gè)反斜杠來替換,因?yàn)閖avascript字符串解析器會(huì)按照\(chéng)n的方式嘗試翻譯\?。為了保證不會(huì)出現(xiàn)這個(gè)問題,在元字符的前面加上兩個(gè)反斜杠(雙重轉(zhuǎn)義)。這個(gè)小小的gotcha就是多數(shù)開發(fā)者更偏好使用字面量語法的原因。
2.使用特殊字符 要使用ASCII來表示一個(gè)字符,則必須指定一個(gè)兩位的十六進(jìn)制代碼,并有前面加上\x。例如字符b的ASCII碼為98,等于十六進(jìn)制的62,因此,表示字符b可以使用\x62 另外也可以使用八進(jìn)制代替十六進(jìn)制來指定字符代碼,直接在反斜杠之后跟上八進(jìn)制數(shù)值,例如,b等于八進(jìn)制的142,所以下面就該這樣 /\142/ 如果要使用Unicode來表示字符,必須指定字符串的四位十六進(jìn)制表示形式,因此b應(yīng)該是\u0062 另外還有其他一些預(yù)定義的特殊字符,如下表所列
字符 |
描述 |
\t |
制表符 |
\n |
換行符 |
\r |
回車符 |
\f |
換頁符 |
\a |
alert字符 |
\e |
escape字符 |
\cx |
與X相對(duì)應(yīng)的控制字符 |
\b |
回退字符 |
\v |
垂直制表符 |
\0 |
空字符 |
3.字符類 3.1簡(jiǎn)單類 假設(shè)相匹配"bat","cat","fat"。使用簡(jiǎn)單類可以很方便的解決這個(gè)問題 /[bcf]at/gi 后面的g表示全匹配,i表示不區(qū)分大小寫。 3.2負(fù)向類 要匹配除了a和b的所有字符,那么這個(gè)字符就是[^ab] 3.3范圍類 [a-z] [A-Z] [0-9] [^1-4] 3.4組合類 匹配所有從a~m的字母以及從1~4的數(shù)字,以及一個(gè)換行符 [a-m1-4\n] 3.5預(yù)定義類
代碼 |
等同于 |
匹配 |
. |
[^\n\r] |
除了換行和回車之外的任意字符 |
\d |
[0-9] |
數(shù)字 |
\D |
[^0-9] |
非數(shù)字字符 |
\s |
[\t\n\x0B\f\r] |
空白字符 |
\S |
[^\t\n\x0B\f\r] |
非空白字符 |
\w |
[a-zA-Z_0-9] |
單詞字符(所有字母,所有的數(shù)字和下劃線) |
\W |
[^a-zA-Z_0-9] |
非單詞字符 |
4.量詞 4.1簡(jiǎn)單量詞
代碼 |
描述 |
|
出現(xiàn)零次或一次 |
* |
出現(xiàn)零次或多次 |
+ |
出現(xiàn)一次或多次(至少出現(xiàn)一次) |
{n} |
一定出現(xiàn)n次 |
{n,m} |
至少出現(xiàn)n次但不超過m次 |
{n,} |
至少出現(xiàn)n次 |
4.2貪婪的、惰性的和支配性的量詞 貪婪量詞:先看整個(gè)的字符串是不是一個(gè)匹配,如果沒有發(fā)現(xiàn)匹配,它去掉字符串中的最后一個(gè)字符,并再次嘗試。直到發(fā)現(xiàn)一個(gè)匹配字符或者字符串不剩任何字符。 惰性量詞:先看字符串中的第一個(gè)字線是不是一個(gè)匹配。如果單獨(dú)這個(gè)字符還不夠,就讀入下一個(gè)字符,組成兩個(gè)字符的字符串,如果還是沒有發(fā)現(xiàn)匹配,繼續(xù)添加字會(huì)直到發(fā)現(xiàn)一個(gè)或者整個(gè)字符都檢查過也沒有匹配。其工作方式恰好與貪婪相反。 支配量詞:只嘗試匹配整個(gè)字符串。如果整個(gè)字符串不能產(chǎn)生匹配,不做進(jìn)一步嘗試。 表示方法如下表
貪婪 |
惰性 |
支配 |
描述 |
|
|
+ |
零次或一次出現(xiàn) |
* |
*? |
*+ |
零次或多次出現(xiàn) |
+ |
+? |
++ |
一次或多次出現(xiàn) |
{n} |
{n}? |
{n}+ |
恰好n次出現(xiàn) |
{n,m} |
{n,m}? |
{n,m}+ |
至少n次至多m次出現(xiàn) |
{n,} |
{n,}? |
{n,}+ |
至少n次出現(xiàn) |
瀏覽器對(duì)支配量詞的支持還很不完善。IE和Opera不支持,Mozilla將支配量詞看作是貪婪的。
二、復(fù)雜模式 1.分組 分組是通過一系列括號(hào)包圍一系列字符、字符類以及量詞來使用的。 /dogdog/可使用分組來重寫成/(dog){2}/ /([bd]ad?)*/匹配零個(gè)和多個(gè)"ba","da","bad"或"dad" /(mom( and dad)?)/匹配"mom" 或 "mom and dad"
2.反向引用 在表達(dá)式計(jì)算完成后還可以怎樣利用分組?每個(gè)分組都被存放在一個(gè)特殊的地方以備將來使用。這些存儲(chǔ)在分組中的特殊值,我們稱之為反向引用。 反向引用是按照從左到右遇到的左括號(hào)字符的順序進(jìn)行創(chuàng)建和編號(hào)的。例如表達(dá)式(A?(B?(C?)))將產(chǎn)生編號(hào)從1-3的三個(gè)反向引用 (1).(A?(B?(C?))) (2).(B?(C?)) (3).(C?) 反向引用可以有幾種不同的使用方法。 首先,使用正則表達(dá)式對(duì)象的test(),match()或search()方法后,反向引用的值可以從RegExp構(gòu)造函數(shù)中獲得。例 var sToMatch = "#123456789"; var reNumbers = /#(\d+)/; reNumbers.test(sToMatch); alert(RegExp.$1); //outputs "123456789" 然后,還可以直接在定義分組的表達(dá)式中包含反向引用,這可以通過使用特殊轉(zhuǎn)義序列如\1,\2等等實(shí)現(xiàn) 例如 var sToMatch = "dogdog"; var reDogDog = /(dog)\1/; alert(reDogDog.test(sToMatch)); //outputs "true" 正則表達(dá)式reDogDog首先創(chuàng)建單詞dog的組,然后又被特殊轉(zhuǎn)義序列\(zhòng)1引用,使得這個(gè)正則表達(dá)式等同于/dogdog/ 第三,反向引用可以用在String對(duì)象的replace()方法中,這通過使用特殊字符序列$1,$2等等來實(shí)現(xiàn)。例如 var sToChange = "1234 5678"; var reMatch = /(\d{4}) (\d{4})/ var sNew = sToChange.replace(reMatch,"$2 $1"); alert(sNew); //outputs "5678 1234"
3.候選 有時(shí)候要構(gòu)建一個(gè)能夠正確匹配想得到所有可能性的模式是十分困難的。如果要對(duì)同一個(gè)表達(dá)式同時(shí)匹配"red"和"break"時(shí)要怎么做呢?這些單詞完全沒有相同的字符,這樣就要寫兩個(gè)不同的正則表達(dá)式,并分別對(duì)兩個(gè)字符串進(jìn)行匹配,像這樣: var sToMatch1 = "red"; var sToMatch2 = "black"; var reRed = /red/; var reBlack = /black/; alert(reRed.test(sToMatch1)||reBlack.test(sToMatch1)); //outputs "true" alert(reRed.test(sToMatch2)||reBlack.test(sToMatch2)); //outputs "true" 這完成了任務(wù),但是十分冗長(zhǎng)。還有另一種方式就是使用正則表達(dá)式的候選操作符。例: var sToMatch1 = "red"; var sToMatch2 = "black"; var reRedOrBlack = /(red|black)/; alert(reRedOrBlack.test(sToMatch1)); //outputs "true" alert(reRedOrBlack.test(sToMatch2)); //outputs "true"
4.非捕獲性分組 創(chuàng)建反向引用的分組,我們稱之為捕獲性分組。同時(shí)還有一種非捕獲性分組,它不會(huì)創(chuàng)建反向引用。在較長(zhǎng)的正則表達(dá)式中,存儲(chǔ)反向引用會(huì)降低匹配速度。 如果要?jiǎng)?chuàng)建一個(gè)非捕獲性分組,只要在左括號(hào)的后面加上一個(gè)問號(hào)和一個(gè)緊跟的冒號(hào): var sToMatch = "#123456789"; var reNumbers = /#(?:\d+)/; reNumbers.test(sToMatch); alert(RegExp.$1); //outputs ""
5.前瞻 有時(shí)候,可能希望,當(dāng)某個(gè)特定的字符分組出現(xiàn)在另一個(gè)字符串之前時(shí),才去捕獲它。如果使用“前瞻”就可以讓這個(gè)過程變得十分簡(jiǎn)單。 前瞻,告訴正則表達(dá)式運(yùn)算器向前看一些字符而不移動(dòng)其位置。同樣存在正向前瞻和負(fù)向前瞻。正向前瞻檢查的是接下來出現(xiàn)的是不是某個(gè)特定字符集。而負(fù)向前瞻則是檢查接下來的不應(yīng)該出現(xiàn)的特定字符集。 創(chuàng)建正向前瞻要將模式放在(?=和)之間。注意這不是分組,雖然它也用到括號(hào)。 var sToMatch1 = "bedroom"; var sToMatch2 = "bedding"; var reBed = /(bed(?=room)/; alert(reBed.test(sToMatch1)); //outputs "true" alert(RegExp.$1); //outputs "bed" alert(reBed.test(sToMatch2)); //outputs "false" 負(fù)向前瞻,則要將模式放在(?!和)之間。 var sToMatch1 = "bedroom"; var sToMatch2 = "bedding"; var reBed = /(bed(?!room)/; alert(reBed.test(sToMatch1)); //outputs "false" alert(reBed.test(sToMatch2)); //outputs "true" alert(RegExp.$1); //outputs "bed"
6.邊界 邊界 用于正則表達(dá)式中表示模式的位置。下表列出了幾種可能的邊界
邊界 |
描述 |
^ |
行開頭 |
$ |
行結(jié)尾 |
\b |
單詞的邊界 |
\B |
非單詞的邊界 |
假設(shè)想查找一個(gè)單詞,但要它只出現(xiàn)在行尾,則可以使用美元符號(hào)$來表示它: var sToMatch = "Important word is the last one."; var reLastWord = /(\w+).$/; reLastWord.test(sToMatch); alert(RegExp.$1); //outputs "one"
7.多行模式 要指定多行模式,只要在正則表達(dá)式后面添加一個(gè)m選項(xiàng)。這會(huì)讓$邊界匹配換行符(\n)以及字符串真正的結(jié)尾。 var sToMatch = "First second\nthird fourth\nfifth sixth"; var reLastWordOnLine = /(\w+)$/gm; var arrWords = sToMatch.match(reLastWordOnLine); 表達(dá)式返回"second","fourth"和"sixth"。若不指定多行模式,表達(dá)式將只返回"sixth"。
二、RegExp對(duì)象 javascript中的每個(gè)正則表達(dá)式都是一個(gè)對(duì)象,同其他的對(duì)象一樣。 1.實(shí)例屬性 global--Boolean值,表示g(全局選項(xiàng))是否已設(shè)置。 ignoreCase--Boolean值,表示i(忽略大小寫選項(xiàng))是否已設(shè)置。 lastIndex--整數(shù),代表下次匹配將會(huì)從哪個(gè)字符位置開始(只有當(dāng)使用exec()或test()函數(shù)才會(huì)填入,否則為0)。 multiline--Boolean值,表示m(多行模式選項(xiàng))是否已設(shè)置。 source--正則表達(dá)式的源字符串形式。例如表達(dá)式/[ba]*/的source將返回"[ba]*"。
2.靜態(tài)屬性 靜態(tài)的RegExp屬性對(duì)所有的正則表達(dá)式都有效。
長(zhǎng)名 |
短名 |
描述 |
input |
$_ |
最后用于匹配的字符串(傳遞給exec()或test()的字符串) |
lastMatch |
$& |
最后匹配的字符 |
lastParen |
$+ |
最后匹配的分組 |
leftContext |
$` |
在上次匹配的前面的子串 |
multiline |
$* |
用于指定是否所有的表達(dá)式都使用多行模式的布爾值 |
rightContext |
$' |
在上次匹配之后的子串 |
IE和Opera并不支持RegExp.multiline,所以最好單獨(dú)的對(duì)每個(gè)表達(dá)式設(shè)置m選項(xiàng)而不要直接設(shè)置這個(gè)標(biāo)記。
|