1.1 RegExp對象的定義
JavaScript對Regex的支援是通過ECMAScript中的RegExp類實現的,它的建構函式可以帶一個或兩個參數,第一個是模式字串,第二個是匹配的額外參數。如:
var str1 = "Woody\nWoody\n1Woody23";
var str = new RegExp("Woody", "gim");
其中,g 表示全域搜尋,i 表示忽略大小寫,m 表示支援多行模式(如上面中的\n)。
1.2 RegExp對象的方法和屬性
1.test():判斷某個字串是否匹配指定的模式;
2.exec():返回一個數組,數組中的第一個條目是第一個匹配,其他的是反向引用;
3.match():返回一個包含在字串中的所有匹配的數組;
4.search():返回在字串中出現的第一個匹配的位置;
5.replace():用另一個字串來替換某個字串中的所有匹配;
6.split():將字串分割成一系列子串並通過一個數組將它們返回;
7.global:表示g是否被設定;
8.ignoreCase:表示i是否被設定;
11.multiline:表示m是否被設定;
9.lastIndex:代表下次匹配將會從哪個字元位置開始;
10.source:Regex的源字串形式;
11.input:表示測試用的字串;
12.lastMatch:最後匹配的字元;
13.lastParen:最後匹配的分組;
14.leftContext:在上次匹配的前面的子串;
15.rightContext:在上次匹配的後面的子串;
16.multiline:指定是否所有的運算式都使用多行模式。
1.3 Regex的簡單模式
1.3.1 元字元
這裡是Regex用到的所有的元字元:
{ [ { \ ^ $ | ) ? * + .
任何時候要在Regex中使用這些元字元,都必須對它們進行轉義。
1.3.2 字元類
簡單類:就是明確知道要尋找的字元,如:var re = /[abc]de]/gi;
負向類:除了指定字元之外的字元,如:var re = /[^abc]de]/gi;
範圍類:指定某個範圍的字元,如:var re = /[a-z]/gi;
組合類別:由上面幾種類混合使用組成,如:var re = /[a-z1-4]/gi;
預定義類:由Regex提供的幾個簡化的運算式,如:
.:除了換行和斷行符號之外的任一字元;
\d:數字;
\D:非數字字元;
\s:空白字元;
\S:非空白字元;
\w:單詞字元;
\W:非單詞字元。
1.4 量詞
指定某個特定模式出現的次數,包括硬性數量和軟性數量。
1.4.1 簡單量詞
?:出現零次或一次;
*:出現零次或多次;
+:出現一次或多次;
{n}:一定出現n次;
{n,m}:至少出現n次但不超過m次;
{n,}:至少出現n次;
1.4.2 貪婪的、惰性的和支配性的量詞
貪婪量詞先看整個字串是不是匹配,如果沒有發現匹配,先去掉最後字串中的最後一個字元,並再次嘗試,如果還沒有發現匹配,那麼再次去掉最後一個字元,這個過程會一直重複下去直到發現匹配或不剩任何字串,上面的簡單量詞都是貪婪量詞。
惰性量詞先看字串中的第一個字母是不是一個匹配,如果不匹配則繼續讀入下一個字元進行匹配,如果沒有則一直匹配下去,與貪婪量詞剛好相反,惰性量詞用上面的簡單量詞跟一個?表示。
支配量詞只嘗試匹配整個字串,如果整個字串不能匹配,不能進一步嘗試。
注意:IE和Opera不支援支配量詞。
1.5 複雜模式
1.5.1 分組
分組是通過用一系列括弧包圍一系列字元、字元類以及量詞來使用的。如:
var str = /(Woody)?/gi;
1.5.2 反向引用
如果模式中使用了分組,通過匹配之後,每個分組都存放在一個特殊的地方以備將來使用,這些儲存在分組中的特殊值,稱之為反向引用,反向引用是按照從左至右遇到的左括弧字元的順序進行建立和編號的。如:(A?(B?))模式產生的反向引用為(A?(B?))、(B?);可以通過$1、$2引用這些值。
1.5.3 候選
相當於OR,在指定的模式中只要有一個匹配就表示成功,用“|”分開各個模式。
1.5.4 非捕獲性分組
建立反向引用的分組,我們稱之為捕獲性分組,而非捕獲性分組不會建立反向引用,這樣不會影響匹配速度,如果要建立一個非捕獲性分組,只要在左括弧的後面加上一個問號和一個緊跟的冒號,如:
var sTo = "#12345678";
var re = /#(?:d+)/;
re.test( sTo );
alert( RegExp.$1 );
1.5.5 前瞻
運用前瞻可以告訴Regex運算器向前看一些字元而不移動其位置,包括正向前瞻和負向前瞻,正向前瞻檢查的是接下來出現的是不是某個特定字元集,而負向前瞻則是檢查接下來的不應該出現的特定字元集。建立正向前瞻要將模式放在(?=和)之間。建立負向前瞻要將模式放在(?!和)之間。
注意:JavaScript只支援Regex的前瞻,而不支援後瞻。
1.5.6 邊界
^:行開頭;
$:行結尾;
\b:單詞的邊界;
\B:非單詞的邊界;
暫且就記錄這麼多了,以後慢慢更新,有好的匹配運算式也把它一起放上來,這裡介紹一個工具,可以用來測試Regex,不過它是firefox的一個外掛程式,需要firefox瀏覽器,在這裡有介紹:https://addons.mozilla.org/firefox/2077/