記正則的一番討論

有一天, 和羣友在作一道題命令:  bash

echo axyzba123bcc456 | grep -oP 'x|(?<=a).*?(?=b)'.net

猜想的結果應該是:code

xyz
123

得出的結果是:對象

[yxxx-xx ~]$ echo axyzba123bcc456 | grep -oP 'x|(?<=a).*?(?=b)'
x
123

可能對於正則,咱們掌握的程度還不夠深刻,因此致使有種懵逼的感受,谷歌了許多資料後,找到了一番解釋,就是零寬斷言和通常的匹配,在匹配的對象上,應該是不一樣:blog

正則匹配主要是字符和位置
字符:有消費
位置:不消費get


插入字符和位置的關係
0a
 1x
   2y
     3z
       4b
         5a
           61
             72
               83
                 9b
                   ....class

匹配x, 從0位置開始
0a循環

用a匹配x, 不知足, 交給(?<=a).*?(?=b)
注意:零寬這時候匹配的是位置, 而不是字符, 因此它匹配的是位置0, 由於位置0前面沒有a, 因此失敗,總體跨過grep

1x
用x匹配x, 知足, 佔有, 總體跳過co

2y..4b 不知足跳過

5a
用a匹配x, 不知足, 交給(?<=a).*?(?=b)
一樣的,它匹配的是位置5, 由於位置5前面沒有a, 因此失敗,總體跨過

61
用字符1匹配x, 不知足, 交給(?<=a).*?(?=b)
一樣的,它匹配的是位置6, 好了, 知足了, 位置6前面有a, 開始匹配剩下的, 知道(?=b)
------------------------------------------------------------------------------------------------------------\

或者這樣理解 
1.這個時候在正則引擎中只有字符a,至關於echo 'a'|grep -P --color 'x'和echo 'a'|grep -P --color '(?<=a).*'都不匹配
2.而後引擎讀入第二個字符'x',引擎內容:ax,至關於echo 'x'|grep -P --color 'x'匹配了,則輸出x,
3.而後正則引擎讀入第3個字符y,引擎內容:axy,至關於echo 'y'|grep -P --color 'x'不匹配,echo 'y'是由於前面的x在上一次被匹配了,因此再也不回溯,再echo 'y'|grep -P --color '(?<=a).*'不匹配
4.一直循環到讀完全部的文本字符,因此最終結果爲x 


一樣嘗試解析前面多個a的狀況
echo aaxyzba123bcc456 | grep -oP 'x|(?<=a).*?(?=b)' 

插入字符和位置的關係
0a
 1a
   2x
     3y
       4z
         5b
           6a
             71
               82
                 93
                   10b
                   ....

從位置0開始
用a匹配x, 不知足, 交給(?<=a).*?(?=b)
這時候,零寬匹配的是位置, 在0的位置前面沒有a, 失敗, 總體跳過

接下來就是位置1
用a匹配x, 不知足, 交給(?<=a).*?(?=b)
這時候位置是1, 好了, 前面有a了..開始.*匹配....

歡迎各位大牛指點教育, 轉載請註明: http://www.javashuo.com/article/p-bqpfuxtf-gm.html

相關文章
相關標籤/搜索