Regular Expression

    內容表格
    沒有標頭

    版本為 16:41, 23 Nov 2024

    到這個版本。

    返回到 版本存檔.

    查閱目前版本

    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 .

    Operator priority
    運算子的優先順序權是極為重要的, 這部分需要務必記住. 就跟先乘除後加減的道理是一樣的.
    順序權: 拖曳字元> 括弧> 量詞> 定位符>  候選
    拖曳字元: \
    括弧: (), (?:), (?=), []
    量詞: *, +, ?, {n}, {n,}, {n,m}
    定位符: ^, $
    候選: |

    Powered by MindTouch Core