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

前端之家收集整理的这篇文章主要介绍了负面的lookbehind断言正则表达式与grep -P有意想不到的结果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在测试以下否定的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.

猜你在找的正则表达式相关文章