加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

记正则的一番讨论

发布时间:2020-12-14 00:45:59 所属栏目:百科 来源:网络整理
导读:有一天,和群友在做一道题命令: echo axyzba123bcc456 | grep -oP 'x|(?=a).*?(?=b)' 猜测的结果应该是: xyz123 得出的结果是: [yxxx-xx ~]$ echo axyzba123bcc456 | grep -oP 'x|(?=a).*?(?=b)'x123 可能对于正则,我们掌握的程度还不够深入,所以导致有种懵逼

有一天,和群友在做一道题命令:

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,它匹配的是位置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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读