Bru*_*ica 5 regex linux grep pcre
我正在测试以下否定的lookbehind断言,我想了解结果:
echo "foo foofoo" | grep -Po '(?<!foo)foo'
Run Code Online (Sandbox Code Playgroud)
它打印出来
foo
foo
foo
Run Code Online (Sandbox Code Playgroud)
我期待只打印两个第一个foo,'echo foo foo foo'而不是第三个foo,因为我的断言应该意味着找到'foo'之前没有'foo'.
我错过了什么?为什么第三个foo匹配?
注意:grep -P意味着将正则表达式解释为perl兼容的正则表达式.grep -o表示只打印匹配的字符串.我的grep是2.5.1版.
经过对这个问题的大讨论(已转移到聊天中),我得出的结论是,我对后向否定断言的理解是正确的:
echo "foo foofoo" | grep -Po '(?<!foo)foo'
Run Code Online (Sandbox Code Playgroud)
应该返回foo两次。
我的 grep 版本或编译它的 PCRE 库有错误。
有些人在他们的机器上使用不同版本的 grep 测试了这个命令,并且得到了不同的结果。有些人看到了两个foo而其他人则看到了三个foo,就像我一样。
我用 Perl 测试了该正则表达式,得到了预期的结果 foo 两次。
grep 手册页指出-P 选项是实验性的。
我的教训是:如果您希望 PCRE 真正有效,请使用 Perl。