so true

          心懷未來,開創未來!
          隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
          數據加載中……

          PCRE Assertions

          首先明確幾點概念:
          1。斷言是一個對當前匹配位置之前或之后的字符的測試;
          2。斷言不會實際消耗任何字符; #這一點至關重要
          通常的用法: (?<=a)b(?=c) #b的前瞻是c,后瞻是a;
          前瞻左置用法:(?=\d)\w+ #\w+需要以\d開始;
          后瞻右置用法:\w+(?<=\d) #\w+需要以\d結束;
          上面三種用法中,我們姑且把b和\w+稱為修飾項。
          對于后兩種用法,要求 前瞻/后瞻 里用以約束修飾項的字符應當是修飾項的子集,否則就不太合適,例如:
          a(?<=b)永遠不可能成立,因為a!=b;
          (?=a)b永遠不可能成立,因為a!=b;
          $ echo 'foobar' | grep -o -P '(?!foo)bar' #它不能用于查找之前出現所有不是 ”foo” 的 ”bar” 匹配, 它會查找到任意的 ”bar” 出現的情況, 因為 (?!foo) 這個斷言在接下來三個字符時 ”bar” 的時候是永遠都 TRUE 的(因為foo!=bar)。
          bar
          $ echo '!abcae20a' | grep -o -P '\w{4,}(?=.*\d)' #0用于支撐后面的前瞻斷言
          abcae2
          $ echo '!abcae20a' | grep -o -P '\w{4,}(?<=\d)' #0不需要拿出來支撐斷言
          abcae20
          $ echo '!abcae20' | grep -o -P '\w{4,}(?<=.*\d)' #后瞻斷言必須定長
          grep: lookbehind assertion is not fixed length
          $ echo '!abcae20' | grep -o -P '(?=.*\d)\w{4,}' #這個前瞻左置斷言不定長,而且前瞻過程中沒有任何字符約束,也比較詭異,匹配不出結果,最好不要這樣寫
          $ echo 'a2 abcae20a' | grep -o -P '(?=.*\d)\w+' #這個前瞻左置斷言不定長,而且前瞻過程中沒有任何字符約束,也比較詭異,只匹配出部分結果,最好不要這樣寫
          a2
          $ echo '!abcae20' | grep -o -P '(?=\w+\d)\w{4,}' #這個前瞻斷言雖然不定長,但是里面的字符都在修飾項的范疇內
          abcae20
          $ echo 'a2 ab!cae20a' | grep -o -P 'a(?=.*\d)\w+' #注意對于第2組結果'ab',里面并不包含數字,但是其后面有數字20,因此前瞻斷言成立
          a2
          ab
          ae20a
          $ echo '!abcae20' | grep -o -P '.*?(?=.*\d)\w{4,}' #可以用最開始的.*來吸收不屬于\w的字符
          !abcae20
          $ echo '!a21ed0' | grep -o -P '(?=(?:\w*?\d){3,})\w{6,}' #實現了最終想要的功能:一個字符串至少有6個字符,而且至少有3個數字
          a21ed0
          總結:前瞻斷言放在修飾項后面比較容易理解;放在修飾項前面時:主要用于概括性的規定修飾項里包含的內容,因此此時的前瞻斷言里允許出現的字符應該都是修飾項里可接受的字符
          更多詳細介紹可以參見:http://www.php.net/manual/zh/reference.pcre.pattern.syntax.php

          posted on 2013-11-20 20:27 so true 閱讀(350) 評論(0)  編輯  收藏 所屬分類: Linux

          主站蜘蛛池模板: 长垣县| 蒙自县| 昌吉市| 荥阳市| 桓台县| 长海县| 扶风县| 东乡族自治县| 旬邑县| 富阳市| 饶河县| 上杭县| 宜兴市| 林甸县| 临漳县| 苗栗县| 榆中县| 庆阳市| 临泽县| 宜宾市| 定安县| 晋江市| 贺兰县| 白玉县| 肇源县| 奇台县| 铜梁县| 泰来县| 广东省| 涿州市| 张家港市| 敦煌市| 垣曲县| 宁津县| 台南市| 宣武区| 灵璧县| 长春市| 武城县| 宝山区| 五台县|