Regex 正則零寬斷言

http://baike.baidu.com/link?url=sLfovpZmIcS5Uz_tiidXoVtjl30Tu3wARMfhnEcbgEGzsb8g1z7dvtGNXTulu1KDodmiuTAP5ODr_R5D2myeeq測試

 

零寬斷言

1_一、(?=exp)   零寬度正預測先行斷言,它斷言自身出現的位置的後面能匹配表達式expurl

1_2、(?<=exp) 零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配表達式exp spa

負向零寬

2_一、(?!exp)零寬度負預測先行斷言,斷言此位置的後面不能匹配表達式exp遞歸

2_2、(?<!exp)零寬度負回顧後發斷言來斷言此位置的前面不能匹配表達式exp字符串

舉例1it

1_1,1_2: (?<=(aa|bb)).+?(?=ing) 匹配以aa或bb開頭,ing結束之間的字符 io

aabbingxxingclass

匹配結果: 1.bb 2.ingxxgcc

  第一次從aabbing匹配出bb,當前匹配到字符串第四個位置,剩下的字符串是ingxxinggc

  因爲(?<=exp)不佔寬度,ingxxing前面是bb,連起來就是bbingxxing,因此匹配出ingxx

 (注: 以上解釋只是我的根據結果推測出來的,說法可能不必定準確,但結果通過測試是正確的,只是方便理解,

     aabb1ingxxing 經過這個正則匹配出來的結果是:bb1

舉例2:

2_1,2_2 : (?<!(a1|b2))\\d{1,}?(?!ing)

a1b23ingxxing a844ing cc66dd只有3被過濾掉了,3前面是b2後面是ing

匹配結果: 1,2, 8,4,6,6

 

            Regex titleRegex3 = new Regex("(?<!(a1|b2))\\w{2,}?(?!ing)" );
            String strong3 = "a1b23ingxxinga844ingcc66dd";
            MatchCollection mcs3 = titleRegex3.Matches(strong3);

            for (int i = 0; i < mcs3.Count; i++)
            {
                Console.WriteLine(i + "---" + mcs3[i].Value);
            }

           匹配結果

          0---a1, 1---23i, 2---ng, 3---xxi, 4---ng, 5---a8,

          6---44i, 7---ng, 8---cc, 9---66, 10---dd

遞歸匹配:

  匹配全部div及div中有嵌套的div

    <div[^>]*>
      [^<>]*
       ( (
           (?'Open'<div[^>]*>)
           [^<>]*
         )+
         (
           (?'-Open'</div>)
           [^<>]*
         )+
       )*
      (?(Open)(?!))
    </div>

     能匹配出

    <div>aa</div>

           <div>aa <div> bb <div>cc</div></div></div>

      div中包含其餘標籤的不能匹配出來,如<div>aa<span>bb</span></div>

相關文章
相關標籤/搜索