我正在测试以下否定的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.