与 \K 相对,以保持正确

ken*_*orb 8 grep perl regular-expression

perlre的扩展模式页面上,我们可以阅读\K

保留 的左侧的内容\K,不要将其包含在 $& 中

这是使用 GNU 的实际示例grep(实际上保留了 的内容\K):

$ echo "foo bar buzz" | grep -Po "foo \Kbar buzz"
bar buzz
Run Code Online (Sandbox Code Playgroud)

有相反的顺序\K吗?

例如打印 just bar,如:

$ echo "foo bar buzz" | grep -Po "foo \Kbar\X buzz"
bar
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 15

在这种情况下,零宽度前瞻(?=...)做你想要的

$ echo foo bar buzz | grep -Po "foo \Kbar(?= buzz)"
bar
Run Code Online (Sandbox Code Playgroud)

它确实需要一些额外的括号。前瞻没有单字符转义,就像 for 那样\K

\K 到目前为止,它实际上只是一个零宽度的后视,所以这也相当于

echo foo bar buzz | grep -Po "(?<=foo )bar(?= buzz)"
Run Code Online (Sandbox Code Playgroud)

我觉得个人更容易遵循。

  • IIRC `pat\K` 和 `(?&lt;=pat)` 之间的区别在于 `\K` 允许可变长度的后视 - AFAIK 前瞻版本没有这样的限制(这也许是为什么没有前瞻等效于` \K`) (5认同)