一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

javascript--正則表達式

 燮羽 2010-11-04
一、簡單模式
1.元字符
這里是正則表達式用到的所有元字符
(  [  {  \  ^  $  |  )  ?  *  +  .
任何時候要在正則表達式中使用這些元字符,都必須對它們進行轉(zhuǎn)義。因此要匹配一個問號,正則表達式就該這樣表示:
var veQMark =/\?/;
或者這樣表示:
var veQMark=new RegExp("\\?");
注意當正則表達式以第二種形式表示時,所有的反斜杠都必須用兩個反斜杠來替換,因為javascript字符串解析器會按照\n的方式嘗試翻譯\?。為了保證不會出現(xiàn)這個問題,在元字符的前面加上兩個反斜杠(雙重轉(zhuǎn)義)。這個小小的gotcha就是多數(shù)開發(fā)者更偏好使用字面量語法的原因。

2.使用特殊字符
要使用ASCII來表示一個字符,則必須指定一個兩位的十六進制代碼,并有前面加上\x。例如字符b的ASCII碼為98,等于十六進制的62,因此,表示字符b可以使用\x62
另外也可以使用八進制代替十六進制來指定字符代碼,直接在反斜杠之后跟上八進制數(shù)值,例如,b等于八進制的142,所以下面就該這樣
/\142/
如果要使用Unicode來表示字符,必須指定字符串的四位十六進制表示形式,因此b應該是\u0062
另外還有其他一些預定義的特殊字符,如下表所列
字符 描述
\t 制表符
\n 換行符
\r 回車符
\f 換頁符
\a alert字符
\e escape字符
\cx 與X相對應的控制字符
\b 回退字符
\v 垂直制表符
\0 空字符

3.字符類
3.1簡單類
假設相匹配"bat","cat","fat"。使用簡單類可以很方便的解決這個問題
/[bcf]at/gi
后面的g表示全匹配,i表示不區(qū)分大小寫。
3.2負向類
要匹配除了a和b的所有字符,那么這個字符就是[^ab]
3.3范圍類
[a-z]
[A-Z]
[0-9]
[^1-4]
3.4組合類
匹配所有從a~m的字母以及從1~4的數(shù)字,以及一個換行符
[a-m1-4\n]
3.5預定義類
代碼 等同于 匹配
. [^\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簡單量詞
代碼 描述
出現(xiàn)零次或一次
* 出現(xiàn)零次或多次
+ 出現(xiàn)一次或多次(至少出現(xiàn)一次)
{n} 一定出現(xiàn)n次
{n,m} 至少出現(xiàn)n次但不超過m次
{n,} 至少出現(xiàn)n次
4.2貪婪的、惰性的和支配性的量詞
貪婪量詞:先看整個的字符串是不是一個匹配,如果沒有發(fā)現(xiàn)匹配,它去掉字符串中的最后一個字符,并再次嘗試。直到發(fā)現(xiàn)一個匹配字符或者字符串不剩任何字符。
惰性量詞:先看字符串中的第一個字線是不是一個匹配。如果單獨這個字符還不夠,就讀入下一個字符,組成兩個字符的字符串,如果還是沒有發(fā)現(xiàn)匹配,繼續(xù)添加字會直到發(fā)現(xiàn)一個或者整個字符都檢查過也沒有匹配。其工作方式恰好與貪婪相反。
支配量詞:只嘗試匹配整個字符串。如果整個字符串不能產(chǎ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)


瀏覽器對支配量詞的支持還很不完善。IE和Opera不支持,Mozilla將支配量詞看作是貪婪的。

二、復雜模式
1.分組
分組是通過一系列括號包圍一系列字符、字符類以及量詞來使用的。
/dogdog/可使用分組來重寫成/(dog){2}/
/([bd]ad?)*/匹配零個和多個"ba","da","bad"或"dad"
/(mom( and dad)?)/匹配"mom" 或 "mom and dad"

2.反向引用
在表達式計算完成后還可以怎樣利用分組?每個分組都被存放在一個特殊的地方以備將來使用。這些存儲在分組中的特殊值,我們稱之為反向引用。
反向引用是按照從左到右遇到的左括號字符的順序進行創(chuàng)建和編號的。例如表達式(A?(B?(C?)))將產(chǎn)生編號從1-3的三個反向引用
(1).(A?(B?(C?)))
(2).(B?(C?))
(3).(C?)
反向引用可以有幾種不同的使用方法。
首先,使用正則表達式對象的test(),match()或search()方法后,反向引用的值可以從RegExp構造函數(shù)中獲得。例
var sToMatch = "#123456789";
var reNumbers = /#(\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1);      //outputs "123456789"
然后,還可以直接在定義分組的表達式中包含反向引用,這可以通過使用特殊轉(zhuǎn)義序列如\1,\2等等實現(xiàn)
例如
var sToMatch = "dogdog";
var reDogDog = /(dog)\1/;
alert(reDogDog.test(sToMatch));      //outputs "true"
正則表達式reDogDog首先創(chuàng)建單詞dog的組,然后又被特殊轉(zhuǎn)義序列\(zhòng)1引用,使得這個正則表達式等同于/dogdog/
第三,反向引用可以用在String對象的replace()方法中,這通過使用特殊字符序列$1,$2等等來實現(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.候選
有時候要構建一個能夠正確匹配想得到所有可能性的模式是十分困難的。如果要對同一個表達式同時匹配"red"和"break"時要怎么做呢?這些單詞完全沒有相同的字符,這樣就要寫兩個不同的正則表達式,并分別對兩個字符串進行匹配,像這樣:
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"
這完成了任務,但是十分冗長。還有另一種方式就是使用正則表達式的候選操作符。例:
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)建反向引用的分組,我們稱之為捕獲性分組。同時還有一種非捕獲性分組,它不會創(chuàng)建反向引用。在較長的正則表達式中,存儲反向引用會降低匹配速度。
如果要創(chuàng)建一個非捕獲性分組,只要在左括號的后面加上一個問號和一個緊跟的冒號:
var sToMatch = "#123456789";
var reNumbers = /#(?:\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1);      //outputs ""

5.前瞻
有時候,可能希望,當某個特定的字符分組出現(xiàn)在另一個字符串之前時,才去捕獲它。如果使用“前瞻”就可以讓這個過程變得十分簡單。
前瞻,告訴正則表達式運算器向前看一些字符而不移動其位置。同樣存在正向前瞻和負向前瞻。正向前瞻檢查的是接下來出現(xiàn)的是不是某個特定字符集。而負向前瞻則是檢查接下來的不應該出現(xiàn)的特定字符集。
創(chuàng)建正向前瞻要將模式放在(?=和)之間。注意這不是分組,雖然它也用到括號。
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"
負向前瞻,則要將模式放在(?!和)之間。
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.邊界
邊界 用于正則表達式中表示模式的位置。下表列出了幾種可能的邊界

邊界 描述
^ 行開頭
$ 行結尾
\b 單詞的邊界
\B 非單詞的邊界

假設想查找一個單詞,但要它只出現(xiàn)在行尾,則可以使用美元符號$來表示它:
var sToMatch = "Important word is the last one.";
var reLastWord = /(\w+).$/;
reLastWord.test(sToMatch);
alert(RegExp.$1);      //outputs "one"

7.多行模式
要指定多行模式,只要在正則表達式后面添加一個m選項。這會讓$邊界匹配換行符(\n)以及字符串真正的結尾。
var sToMatch = "First second\nthird fourth\nfifth sixth";
var reLastWordOnLine = /(\w+)$/gm;
var arrWords = sToMatch.match(reLastWordOnLine);
表達式返回"second","fourth"和"sixth"。若不指定多行模式,表達式將只返回"sixth"。

二、RegExp對象
javascript中的每個正則表達式都是一個對象,同其他的對象一樣。
1.實例屬性
global--Boolean值,表示g(全局選項)是否已設置。
ignoreCase--Boolean值,表示i(忽略大小寫選項)是否已設置。
lastIndex--整數(shù),代表下次匹配將會從哪個字符位置開始(只有當使用exec()或test()函數(shù)才會填入,否則為0)。
multiline--Boolean值,表示m(多行模式選項)是否已設置。
source--正則表達式的源字符串形式。例如表達式/[ba]*/的source將返回"[ba]*"。

2.靜態(tài)屬性
靜態(tài)的RegExp屬性對所有的正則表達式都有效。
長名 短名 描述
input $_ 最后用于匹配的字符串(傳遞給exec()或test()的字符串)
lastMatch $& 最后匹配的字符
lastParen $+ 最后匹配的分組
leftContext $` 在上次匹配的前面的子串
multiline $* 用于指定是否所有的表達式都使用多行模式的布爾值
rightContext $' 在上次匹配之后的子串

IE和Opera并不支持RegExp.multiline,所以最好單獨的對每個表達式設置m選項而不要直接設置這個標記。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲一区在线观看蜜桃| 欧洲日本亚洲一区二区| 精品日韩中文字幕视频在线| 99亚洲综合精品成人网色播| 97精品人妻一区二区三区麻豆| 久久福利视频视频一区二区| 亚洲国产av在线观看一区 | 日韩美女偷拍视频久久| 91久久精品中文内射| 久久国产人妻一区二区免费| 狠狠做深爱婷婷久久综合| 国产又色又爽又黄的精品视频| 国产一区欧美午夜福利| 欧美日韩成人在线一区| 夜色福利久久精品福利| 亚洲欧美天堂精品在线| 国产情侣激情在线对白| 国产精品刮毛视频不卡| 少妇人妻一级片一区二区三区 | 久久这里只精品免费福利| 欧美一二三区高清不卡| 日韩一区二区三区在线日| 国产一级特黄在线观看| 婷婷伊人综合中文字幕| 日韩性生活片免费观看| 亚洲天堂精品1024| 色好吊视频这里只有精| 国产国产精品精品在线| 欧洲偷拍视频中文字幕| 欧美国产精品区一区二区三区| 日韩特级黄色大片在线观看| 91人妻人澡人人爽人人精品| 亚洲国产四季欧美一区| 一级欧美一级欧美在线播| 熟女免费视频一区二区| 欧美日韩亚洲巨色人妻| 一区二区三区日韩中文| 欧美日韩视频中文字幕| 尹人大香蕉中文在线播放| 欧美日韩综合在线第一页| 亚洲欧洲在线一区二区三区|