Simple Regular Expression
var pattern;
普通字元
特殊字元顯示, 例如^, $, (, ), {, }, +, *, ., ?, |, [, ], 這些字元沒辦法直接使用, 因為這些字元是有意義的. 如果要把他轉成普通字元必須加上拖曳字元符號 \.
pattern=/\\/;
pattern=/\^/;
pattern=/\$/;
pattern=/\+/;
pattern=/\\\\/;
//etc, ......
特殊字元
有些無法打入的特殊字元表示, 例如搭配拖曳字元加上英文字原來表示, 這些特殊字元例如: Enter分行符號, 定位字元等等....
pattern=/\t/; //定位字元
pattern=/\n\; //換行
pattern=/\r/; //Enter
pattern=/\f/; //換頁
pattern=/\a/; //alert字元
pattern=/\e/; //escape字元
pattern=/\v/; //垂直定位字元
pattern=/\0/; //空字
pattern=/\x65/; //xN|N is hex format. N=65=>A; N=97=>a
字元類別
簡單類, 反向類, 範圍類, 組合類和預定義類.
>簡單類:
使用 [] 符號可以表達 或/OR 的關係.
pattern=/[123]/; //表示匹配的字元有三種, 1, 2或著3.
>反向類:
表示簡單類的 NOT 關係.
pattern=/[^abcdef]/; //表示匹配a, b, c, d, e和f以外的字元.
>範圍類:
允許匹配的字元在某個範圍(Range)內.
pattern=/[a-z]/; //表示匹配a到z內的字元.
pattern=/[A-Z]/; //表示匹配A到Z內的字元.
pattern=/[0-9]/; //表示匹配0到9內的字元.
pattern=/[a-zA-Z0-9]/; //表示可以匹配a-z, A-Z或著0-9這三類內的字元.
pattern=/[^0-9]/; //反向關係, 匹配0到9以外的字元.
pattern=/[^a-z0-9]/; //表示匹配a到z和0到9以外的字元.
>組合類:
簡單類, 反向類和範圍類的組合型.
pattern=/[A-Z0-9\.]/; //表示匹配A到Z, 0到9和.字元.
>預定義類:
對於某種組合類表示, 預定義類予以用拖曳字元搭配英文字來對應.
pattern=/./; //[^\n\r]
pattern=/\d/; //[0-9]
pattern=/\D/; //[^0-9]
pattern=/\s/; //[ \t\n\x0B\f\r]
pattern=/\S/; //[^ \t\n\x0B\f\r]
pattern=/\w/; //[a-zA-Z_0-9]
pattern=/\W/; //[^a-zA-Z_0-9]
量詞
用來限制某些匹配字元的個數, 稱為限定詞. 限定詞: *, +, ?, {n}, {n,}, {n,m}.
pattern=/a*b/; // * 的限定詞表示允許匹配出現0次或著多次的前字元. a*b表示允許出現b, ab, aab, aaab, ....
pattern=/a+b/; // + 的限定詞表示允許匹配出現至少一次的前字元. a+b表示允許出現ab, aab, aaab, ....
pattern=/a[cd]?/; // ? 的限定詞表示允許匹配出現0次或著1次的前字元. a[cd]?表示允許出現a, ac, ad.
pattern=/\d{2}/; // {n}|n is number and n>=0的關係是表示允許匹配出現n次的前字元. \d{2}表示允許出現\d\d.
pattern=/\w\d{2,}/; //{n,}的關係表示必須匹配出現>=n次的前字元. \w\d{2,}表示允許出現a12, b456,...
pattern=/ba{1,3}/; //{n,m}的關係表示必須匹配出現最少n次,最多m次的前字元. ba{1,3}表示允許出現ba, baa, baaa.
Examples:
pattern=/\$\d+\.?\d*/; \\價格檢查, \$顯示$, \d+出現至少一次, \.出現0或1次, \d*出現0或多次. 合法: $910, $13.5, $12.58
pattern=/\d{3}-\d{7-8}/; \\數字組合區段檢查, \d{3}必須出現三次, \d{7-8}必須出現最少7次, 最多8次.
Greedy Qualifier
使匹配字串和運算式盡可能多次匹配. Regular Expression預設是Greedy.
pattern=/a\d+/; \\允許a1, a12, a974, a6521, a75392, a852433281
pattern=/fo{2,}/; \\允許foo, fooo,foooo, foooooooo
Lazy Qualifier
為Greedy Qualifier的相反意義. 盡可能少量匹配. 這代表著最多允許出現次數為0或1次的最少次數. 搭配 ? 限定詞組合.
pattern=/a\d?/; //允許a1, a2, a3, ..., a9的最少匹配.
pattern=/pk\d{3,4}?/; //\d{3,4}允許最少匹配3次的\d. 設\d{3,4}=t, t?允許t允許最少匹配1次.
pattern=/a\d+?/; \\在a15422222的情況下, /d+的最少匹配為1.
pattern=/fo{2,}?/; \\使得o{2,}最少匹配為oo.
Complex Regular Expression
相對於Simple Regular Expression, Complex Regular Expression實現更為複雜的高級匹配應用. 實現分組, 反向引用, 候選, 非捕獲性分組, 前置, 邊界定位標示和多行模式等.
分組
分組的概念很簡單, 只要記住幾個原則就好:
1. 可用於表示多次重複出現的字元或字串
2. 一整個pattern可以說是一個大匹配, 透過分組應用可以將整個pattern拆分成各類子匹配, 意味著子匹配可以被獲取.
3. 子匹配的結果, 會被配置在緩衝區, 並且按照順序予以編號. 一整個pattern是一個匹配, 編號為0. 子匹配從編號1開始.
分組的展現使用了 () 符號, 來圈住所要規定出現的字元或字串.
pattern=/(a1b2c3){3}/; //表示出現a1b2c3, 且要出現三次. 設t=a1b2c3, 結果為ttt重複三次.
pattern=/abc(\d+)/; //前部分規定要出現abc, 分組使(\d+)結果讓數字出現至少1次以上. 允許匹配: abc1, abc32, abc985
pattern=/(abc(123))/; //子匹配會被配置在緩衝區予以編號.(123)是第二層子匹配為編號2. 外層(abc)則是編號1
反向引用
當要反方向獲取前面的子匹配結果, 便可使用反向引用. 語法展現為 \num, 且num為數字, 作為緩衝區編號.
pattern=/(\w)\1{4}/; //\w為[a-zA-Z_0-9], 設t=(\w), \1{4}表示獲取$1的子匹配, 並且連續4次, 允許匹配: rrrr, 5555.
候選
當我們規定某個字串或字元檢查允許幾種形式出現, 便可以使用候選. 他的表示為 expression1|expression2, 使用了 | 的符號區隔.
pattern=/John|Jack/; //允許出現John和Jack這兩種形式.
pattern=/('|"").*?\1/;
/* ('|"")允許出現 ' 或著 " 兩種形式, 且配置緩衝區$1, .*允許出現[^\n\r]有0次或著多次情況, 但是因為使用了 ? 的Lazy Qualifier形式, 所以最少匹配要一次. 透過\1取出緩衝區$1的子匹配結果, 也就是('|"). 允許的配對: "color", '1', "a2". */
非捕獲性分組
非捕獲性分組只有一個簡單的規則, 就是與分組的相反, 並不會將子匹配結果配置在緩衝區, 也就是你無法使用反向引用\num取出. 這種形式適用" 在如果匹配的檢查, 本身檢查內容並沒有多大的意義, 沒友值得快取緩衝區的價值 ".
非捕獲性分組使用了 (?:pattern) 的形式展現.
pattern=/pro(?:gram|ject)/; //gram和ject本身沒多大意義, 使用非捕獲性分組. 允許匹配: program或著project.
正向前置
正向前置概念簡單, 但有幾種規則:
1. 其匹配的結果不會配置在緩衝區.
2. 如果匹配檢查有要求結果回傳. 正向前置內的檢查結果不會作為結果回傳.
3. 使用(?=pattern)的形式展現.
pattern=/bed(?=room)/; //允許匹配: bedroom, 但是room不會配置在緩衝區, 也不作為結果回傳. 因為回傳只有bed.
pattern=/Windows(?=2000|XP)/; //允許匹配:Windows2000和WindowsXP, 2000和XP不配置在緩衝區也不回傳結果.
負向前置
負向前置的檢查方式與正向前置相反, 負向前置表示期檢查的內容不能出現在規定的pattern. 與正向前置有共通的特徵:
1. 其匹配的結果不會配置在緩衝區.
2. 如果匹配檢查有要求結果回傳. 負向前置內的檢查結果不會作為結果回傳.
負向前置使用(?!pattern)的形式展現.
pattern=/bed(?!room)/; //允許匹配bedroom以外的情況. room不會配置緩衝區也不會回傳. 回傳只有bed.
pattern=/Windows(?!2000|XP)/; //允許匹配Windows2000和WindowsXP以外的情況. 2000和XP不會配置緩衝區和回傳.
邊界定位符
概念簡單, 就是限制匹配檢查的範圍.
^, 匹配檢查的開始點.
$, 匹配檢查的結束點.
\b, 匹配檢查單詞邊界, 針對了單詞和空格之間的位置以及開始與結束位置, 除此之外, 不匹配其他字元.
\B, \b的相反意義.
pattern=/^aaa/; //匹配檢查範圍從第一個a作為起始. 允許匹配: aaa xxx sss; 不允許匹配: sss aaa zzz
pattern=/aaa$/; //匹配檢查範圍界定在結尾部分作為終點. 允許匹配: ccc ddd aaa; 不允許匹配: xxx www aaa zzz.
pattern=/^I am John$/; //匹配檢查由^開始到$為止的範圍. 允許匹配: I am John; 不允許匹配: Hi, I am John!...
pattern=/\bCSharp\b/; //匹配檢查的條件由\b開始到\b結尾. 允許匹配: PGR Language CSharp , Yaaa;(CSharp的間距)
pattern=/\BJava\B/; //\b的相反. 允許匹配: This is OO language [Java]!; 不允許匹配: This is OO language Java .