有一天, 和羣友在做一道題命令:
echo axyzba123bcc456 | grep -oP 'x|(?<=a).*?(?=b)'
猜測的結果應該是:
xyz
123
得出的結果是:
[yxxx-xx ~]$ echo axyzba123bcc456 | grep -oP 'x|(?<=a).*?(?=b)'
x
123
可能對於正則,我們掌握的程度還不夠深入,所以導致有種懵逼的感覺,谷歌了許多資料後,找到了一番解釋,就是零寬斷言和一般的匹配,在匹配的對象上,應該是不同:
正則匹配主要是字符和位置
字符:有消費
位置:不消費
插入字符和位置的關係
0a
1x
2y
3z
4b
5a
61
72
83
9b
....
匹配x, 從0位置開始
0a
用a匹配x, 不滿足, 交給(?<=a).*?(?=b)
注意:零寬這時候匹配的是位置, 而不是字符, 所以它匹配的是位置0, 因爲位置0前面沒有a, 所以失敗,整體跨過
1x
用x匹配x, 滿足, 佔有, 整體跳過
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了..開始.*匹配....
歡迎各位大牛指點教育, 轉載請註明: https://my.oschina.net/u/2291453/blog/793296