JavaScript 學習筆記(十四) Regex

來源:互聯網
上載者:User

RegExp類
RegExp對象的建構函式可以帶一個或兩個參數
第一個參數是描述需要進行匹配的模式字串,如果還有第二個參數,這個參數則制定了額外的處理指示。
一、基礎
1.1使用RegExp對象
test()方法
測試是否匹配。如果給定字串(只有一個參數)匹配這個模式,它就返回true,否則返回false

複製代碼 代碼如下:var sToMatch = "cat";
var reCat = /cat/; //Regex字面量使用Perl風格的文法
alert(reCat.test(sToMatch)); //outs "true"

exec()方法
有一個字串參數,返回一個數組。數組中的第一個條目是第一個匹配,其他的是反向引用。(即數組中只有一個,並且是第一個匹配的) 複製代碼 代碼如下: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()方法

返回一個包含在字串中的所有匹配的數組。
var strAAA = "a bat, a Cat, a fAt baT, a faT cat";
var regAt = new RegExp("at", "gi");
var arrMatch = strAAA.match(regAt); //注意:字串.match(參數是匹配字元)跟上面相反
search()方法
與indexOf()有些類似,返回在字串中出現的一個匹配的位置。它的參數是一個RegExp對象而非僅僅一個子字串。 複製代碼 代碼如下: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" 第一次出現位置是3

1.2擴充字元串方法
replace()方法
可以用第二個參數替換第一個參數,而在這裡第一個參數也可以是一個Regex。
var strBBB = "The Sky is red.";
//將上面這句話中的所有s替換,用Regex找出所有匹配的
var strNewBBB = strBBB.replace(/s/gi, "##"); //把所有的“s”(不管大小寫)都替換成##
再進行升級一下,第二個參數也可以是一個函數 複製代碼 代碼如下:var sToChange = "The sky is red.";
var reRed = /red/;
var sResultText = sToChange.replace(reRed, function(sMatch) {
return "blue";
});
alert(sResultText);

在這個例子中,在函數中的sMatch的值總為"red" (因為這是唯一匹配的模式)."red"的首次出現被替換為函數的傳回值"blue".
附加:
對於書上這句話“因為這是唯一匹配的模式”我認為應該是這個意思吧,replace只有兩個參數,第一個參數找出來的是唯一的,那個function的參數sMatch應該就是前面的第一個參數的值,唯一匹配模式。。。
split()方法 複製代碼 代碼如下:var sColor = "red,blue,yellow,green";
var reComma = /\,/;
var arrColors = sColor.split(reComma); //split at each comma
alert(arrColors.length); //outputs "4"

RegexreComma中必須在逗號前有一個反斜線,因為逗號在文法中有特殊含義,必須經過轉義。
二、簡單模式
2.1元字元
Regex用到的所有元字元有:
( [ { \ ^ $ | ) ? * + .
一共12個。在任何時候要用到這些元字元的時候就需要轉義,也就是在前面加上反斜線。
例:
var reQMark = /\?/; //轉義
var reQMark=new RegExp("\\?"); //這裡需要注意,雙重轉義,因為本身反斜線也是需要轉義
所以我們以後應該盡量使用第一種情況,字面量文法!Perl的風格
2.2使用特殊字元
另外,還有其他一些預定義的特殊字元,如下表所列:
字元 描述
----------------------------------------------------
\t 定位字元
\n 分行符號
\r 斷行符號符
\f 換頁符
\a alert字元
\e escape字元
\cX 與X相對應的控制字元
\b 回退字元
\v 垂直定位字元
\0 Null 字元
----------------------------------------------------
2.3字元類
將一些字元放入方括弧中,可以很有效告訴Regex去匹配第一個、第二個、第三個字元等等。
//①字元類----簡單類
var sToMatch = "a bat,a Cat,a fAt baT,a faT cat";
//匹配以bat或cat或fat的Regex
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"
//②字元類----負向類
var sToMatch = "a bat,a Cat,a fAt baT,a faT cat";
//匹配以at結尾,但是不以b或c開頭的Regex
var reBatCatRat = /[^bc]at/gi; //脫字元^表示不能匹配後面跟著的字元
var arrMatches = sToMatch.match(reBatCatRat);
alert(arrMatches.join(",")); //輸出 "fAt,faT"
//③字元類----範圍類
//指定從a到z之間的範圍:[a-z]. 這裡是區分大小寫
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的數字,以及一個分行符號,那麼所用到的類應該是這樣:
[a-m1-4\n]
注意在內部的類之間不要有空格.
//⑤字元類----預定義類
代碼 等同於 匹配
----------------------------------------------------------------
. [^\n\r] 除了換行和斷行符號之外的任一字元
\d [0-9] 數字
\D [^0-9] 非數字字元
\s [ \t\n\x0B\f\r] 空白字元
\S [^ \t\n\x0B\f\r] 非空白字元
\w [a-zA-Z_0-9] 單詞字元(所有的字元、數字和底線)
\W [^a-zA-Z_0-9] 非單詞字元
-----------------------------------------------------------------
使用預定義字元可以明顯地使模式比對變得簡單。例如,假設想匹配3個數字:
var sToMatch = "567 9838 abc";
var reThreeNums = /[0-9][0-9][0-9]/;
//var reThreeNums=/\d\d\d/; //用預定義比較簡潔
alert(reThreeNums.test(sToMatch)); //輸出 "true"
2.4量詞
量詞(quantifier)可以指定某個特定模式出現的次數。當指定某個模式應當出現的次數時,可以指定硬性數量,也可以指定軟性數量。
1.簡單量詞
--------------------------------------------------------------------
代碼 描述
--------------------------------------------------------------------
? 出現零次或一次
* 出現零次或多次(任意次)
+ 出現一次或多次(至少出現一次)
{n} 一定出現n次
{n,m} 至少出現n次但不超過m次
{n,} 至少出現n次
--------------------------------------------------------------------
例如,假設想匹配單詞bread,read或red.使用問號量詞,則可以只要使用一個運算式就可以匹配這三個:
var reBreadReadOrRed = /b?rea?d/;
或者var reBreadReadOrRed = /b{0,1}rea{0,1}d/;
2.貪婪的、惰性的和支配性的量詞
貪婪量詞先看整個的字串是否匹配。如果沒有發現匹配,它去掉該字串中的最後一個字元,並再次嘗試。如果還是沒有發現匹配,那麼再次去掉最後一個字元,這個過程會一直重複直至到發現一個匹配或者字串不剩任何字元。
懶性量詞先看字串中的第一個字母是否匹配。如果單獨這個字元還不夠,就讀入下一個字元,組成兩個字元的字串。如果還是沒有發現匹配,惰性量詞繼續從字串中添加字元直到發現匹配或者整個字串都檢查過也沒有匹配。惰性量詞和貪婪量詞的工作方式恰好相反。
支配量詞只嘗試匹配整個字串。如果整個字串不能產生匹配,不做進一步嘗試。支配量詞其實簡單的說,就是一刀切。
--------------------------------------------------------------------
貪婪 惰性 支配 描述
--------------------------------------------------------------------
? ?? ?+ 零次或一次出現
* *? *+ 零次或多次出現
+ +? ++ 一次或多次出現
{n} {n}? {n}+ 恰好n次出現
{n,m} {n,m}? {n,m}+ 至少n次至多m次出現
{n,} {n,}? {n,}+ 至少n次出現
--------------------------------------------------------------------
看下面例子更好的理解以上三種量詞
var str = "abbbaabbbaaabbb1234";
var reg1 = /.*bbb/g;
var reg2 = /.*?bbb/g;
//var reg3 = /.*+bbb/g; //在Visual Studio2008裡報錯.....
var arrMatches1 = str.match(reg1);
var arrMatches2 = str.match(reg2);
//var arrMatches3 = str.match(reg3);
alert("貪婪的:" + arrMatches1.join(",") + "\n惰性的:" + arrMatches2.join(","));
主要是匹配的一個過程不同!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.