记正则的一番讨论

有一天, 和群友在作一道题命令:  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

相关文章
相关标签/搜索