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

负面的lookbehind断言正则表达式与grep -P有意想不到的结果

发布时间:2020-12-14 06:07:40 所属栏目:百科 来源:网络整理
导读:我正在测试以下否定的lookbehind断言,我想了解结果: echo "foo foofoo" | grep -Po '(?!foo)foo' 它打印出来 foofoofoo 我期待只打印两个第一个foo,’echo foo foofoo’但不是第三个,因为我的断言应该意味着找到’foo’之前没有’foo’. 我错过了什么?为什
我正在测试以下否定的lookbehind断言,我想了解结果:

echo "foo foofoo" | grep -Po '(?<!foo)foo'

它打印出来

foo
foo
foo

我期待只打印两个第一个foo,’echo foo foofoo’但不是第三个,因为我的断言应该意味着找到’foo’之前没有’foo’.

我错过了什么?为什么第三个foo匹配?

注意:grep -P意味着将正则表达式解释为perl兼容的正则表达式. grep -o表示只打印匹配的字符串.我的grep是2.5.1版.

解决方法

经过对这个问题的大讨论(已经转移到聊天中),我得出的结论是,我对后观负面断言的理解是正确的:

echo "foo foofoo" | grep -Po '(?<!foo)foo'

应该返回foo两次.

我的grep版本,或者它编译的PCRE库,都是错误的.

有些人在他们的机器上使用不同版本的grep测试了这个命令,并且它们有不同的结果.有些人看过两个foo,有些人有三个foo,就像我一样.

我tested that regex with Perl和我有预期的结果,foo两次.

grep man page声明-P选项是实验性的.

我的教训是:如果你想要真正有用的PCRE,请使用Perl.

(编辑:李大同)

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

    推荐文章
      热点阅读