|
RegExp類
RegExp對(duì)象的構(gòu)造函數(shù)可以帶一個(gè)或兩個(gè)參數(shù)
第一個(gè)參數(shù)是描述需要進(jìn)行匹配的模式字符串,如果還有第二個(gè)參數(shù),這個(gè)參數(shù)則制定了額外的處理指令。
一、基礎(chǔ)
1.1使用RegExp對(duì)象
test()方法
測(cè)試是否匹配。如果給定字符串(只有一個(gè)參數(shù))匹配這個(gè)模式,它就返回true,否則返回false
復(fù)制代碼 代碼如下:
var sToMatch = "cat";
var reCat = /cat/; //正則表達(dá)式字面量使用Perl風(fēng)格的語法
alert(reCat.test(sToMatch)); //outs "true"
exec()方法
有一個(gè)字符串參數(shù),返回一個(gè)數(shù)組。數(shù)組中的第一個(gè)條目是第一個(gè)匹配,其他的是反向引用。(即數(shù)組中只有一個(gè),并且是第一個(gè)匹配的)
復(fù)制代碼 代碼如下:
var strAAA = "a bat, a Cat, a fAt baT, a faT cat";
var regAt = new RegExp("at", "gi");
var arr = regAt.exec(strAAA); //arr[0]為"at",arr.index值為3,arr.lastIndex值為5
match()方法
返回一個(gè)包含在字符串中的所有匹配的數(shù)組。
var strAAA = "a bat, a Cat, a fAt baT, a faT cat";
var regAt = new RegExp("at", "gi");
var arrMatch = strAAA.match(regAt); //注意:字符串.match(參數(shù)是匹配字符)跟上面相反
search()方法
與indexOf()有些類似,返回在字符串中出現(xiàn)的一個(gè)匹配的位置。它的參數(shù)是一個(gè)RegExp對(duì)象而非僅僅一個(gè)子字符串。
復(fù)制代碼 代碼如下:
var strAAA = "a bat, a Cat, a fAt baT, a faT cat";
var regAt = new RegExp("at", "gi");
var index = strAAA.search(regAt); //outputs "3" 第一次出現(xiàn)位置是3
1.2擴(kuò)展字符串方法
replace()方法
可以用第二個(gè)參數(shù)替換第一個(gè)參數(shù),而在這里第一個(gè)參數(shù)也可以是一個(gè)正則表達(dá)式。
var strBBB = "The Sky is red.";
//將上面這句話中的所有s替換,用正則表達(dá)式找出所有匹配的
var strNewBBB = strBBB.replace(/s/gi, "##"); //把所有的“s”(不管大小寫)都替換成##
再進(jìn)行升級(jí)一下,第二個(gè)參數(shù)也可以是一個(gè)函數(shù)
復(fù)制代碼 代碼如下:
var sToChange = "The sky is red.";
var reRed = /red/;
var sResultText = sToChange.replace(reRed, function(sMatch) {
return "blue";
});
alert(sResultText);
在這個(gè)例子中,在函數(shù)中的sMatch的值總為"red" (因?yàn)檫@是唯一匹配的模式)."red"的首次出現(xiàn)被替換為函數(shù)的返回值"blue".
附加:
對(duì)于書上這句話“因?yàn)檫@是唯一匹配的模式”我認(rèn)為應(yīng)該是這個(gè)意思吧,replace只有兩個(gè)參數(shù),第一個(gè)參數(shù)找出來的是唯一的,那個(gè)function的參數(shù)sMatch應(yīng)該就是前面的第一個(gè)參數(shù)的值,唯一匹配模式。。。
split()方法
復(fù)制代碼 代碼如下:
var sColor = "red,blue,yellow,green";
var reComma = //,/;
var arrColors = sColor.split(reComma); //split at each comma
alert(arrColors.length); //outputs "4"
正則表達(dá)式reComma中必須在逗號(hào)前有一個(gè)反斜杠,因?yàn)槎禾?hào)在語法中有特殊含義,必須經(jīng)過轉(zhuǎn)義。
二、簡(jiǎn)單模式
2.1元字符
正則表達(dá)式用到的所有元字符有:
( [ { / ^ $ | ) ? * + .
一共12個(gè)。在任何時(shí)候要用到這些元字符的時(shí)候就需要轉(zhuǎn)義,也就是在前面加上反斜杠。
例:
var reQMark = //?/; //轉(zhuǎn)義
var reQMark=new RegExp("http://?"); //這里需要注意,雙重轉(zhuǎn)義,因?yàn)楸旧矸葱备芤彩切枰D(zhuǎn)義
所以我們以后應(yīng)該盡量使用第一種情況,字面量語法!Perl的風(fēng)格
2.2使用特殊字符
另外,還有其他一些預(yù)定義的特殊字符,如下表所列:
字符 描述
----------------------------------------------------
/t 制表符
/n 換行符
/r 回車符
/f 換頁符
/a alert字符
/e escape字符
/cX 與X相對(duì)應(yīng)的控制字符
/b 回退字符
/v 垂直制表符
/0 空字符
----------------------------------------------------
2.3字符類
將一些字符放入方括號(hào)中,可以很有效的告訴正則表達(dá)式去匹配第一個(gè)、第二個(gè)、第三個(gè)字符等等。
//①字符類----簡(jiǎn)單類
var sToMatch = "a bat,a Cat,a fAt baT,a faT cat";
//匹配以bat或cat或fat的正則表達(dá)式
var reBatCatFat = /[bcf]at/gi;
//var reBatCatRat=/[/u0062cf]at/gi; 使用Unicode形式
var arrMatches = sToMatch.match(reBatCatRat);
alert(arrMatches.join(",")); //輸出"bat,Cat,fAt,baT,faT,cat"
//②字符類----負(fù)向類
var sToMatch = "a bat,a Cat,a fAt baT,a faT cat";
//匹配以at結(jié)尾,但是不以b或c開頭的正則表達(dá)式
var reBatCatRat = /[^bc]at/gi; //脫字符^表示不能匹配后面跟著的字符
var arrMatches = sToMatch.match(reBatCatRat);
alert(arrMatches.join(",")); //輸出 "fAt,faT"
//③字符類----范圍類
//指定從a到z之間的范圍:[a-z]. 這里是區(qū)分大小寫的
var sToMatch = "num1,num2,num3,num4,num5,num6,num7,num8,num9";
var reONEToFour = /num[1-4]/gi; //從1到4
var arrMatches = sToMatch.match(reONEToFour);
alert(arrMatches.join(",")); //輸出 "num1,num2,num3,num4"
//④字符類----組合類
組合類(combination class)是由幾種其他的類組合而成的字符類.
假如要匹配所有的從a-m的字母以及從1-4的數(shù)字,以及一個(gè)換行符,那么所用到的類應(yīng)該是這樣:
[a-m1-4/n]
注意在內(nèi)部的類之間不要有空格.
//⑤字符類----預(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] 非單詞字符
-----------------------------------------------------------------
使用預(yù)定義字符可以明顯地使模式匹配變得簡(jiǎn)單。例如,假設(shè)想匹配3個(gè)數(shù)字:
var sToMatch = "567 9838 abc";
var reThreeNums = /[0-9][0-9][0-9]/;
//var reThreeNums=//d/d/d/; //用預(yù)定義比較簡(jiǎn)潔
alert(reThreeNums.test(sToMatch)); //輸出 "true"
2.4量詞
量詞(quantifier)可以指定某個(gè)特定模式出現(xiàn)的次數(shù)。當(dāng)指定某個(gè)模式應(yīng)當(dāng)出現(xiàn)的次數(shù)時(shí),可以指定硬性數(shù)量,也可以指定軟性數(shù)量。
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次
--------------------------------------------------------------------
例如,假設(shè)想匹配單詞bread,read或red.使用問號(hào)量詞,則可以只要使用一個(gè)表達(dá)式就可以匹配這三個(gè):
var reBreadReadOrRed = /b?rea?d/;
或者var reBreadReadOrRed = /b{0,1}rea{0,1}d/;
2.貪婪的、惰性的和支配性的量詞
貪婪量詞先看整個(gè)的字符串是否匹配。如果沒有發(fā)現(xiàn)匹配,它去掉該字符串中的最后一個(gè)字符,并再次嘗試。如果還是沒有發(fā)現(xiàn)匹配,那么再次去掉最后一個(gè)字符,這個(gè)過程會(huì)一直重復(fù)直至到發(fā)現(xiàn)一個(gè)匹配或者字符串不剩任何字符。
懶性量詞先看字符串中的第一個(gè)字母是否匹配。如果單獨(dú)這個(gè)字符還不夠,就讀入下一個(gè)字符,組成兩個(gè)字符的字符串。如果還是沒有發(fā)現(xiàn)匹配,惰性量詞繼續(xù)從字符串中添加字符直到發(fā)現(xiàn)匹配或者整個(gè)字符串都檢查過也沒有匹配。惰性量詞和貪婪量詞的工作方式恰好相反。
支配量詞只嘗試匹配整個(gè)字符串。如果整個(gè)字符串不能產(chǎn)生匹配,不做進(jìn)一步嘗試。支配量詞其實(shí)簡(jiǎ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)
--------------------------------------------------------------------
看下面例子更好的理解以上三種量詞
var str = "abbbaabbbaaabbb1234";
var reg1 = /.*bbb/g;
var reg2 = /.*?bbb/g;
//var reg3 = /.*+bbb/g; //在Visual Studio2008里報(bào)錯(cuò).....
var arrMatches1 = str.match(reg1);
var arrMatches2 = str.match(reg2);
//var arrMatches3 = str.match(reg3);
alert("貪婪的:" + arrMatches1.join(",") + "/n惰性的:" + arrMatches2.join(","));
主要是匹配的一個(gè)過程不同!
JavaScript技術(shù):JavaScript 學(xué)習(xí)筆記(十四) 正則表達(dá)式,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。