在vim中定位lookaround位置 [可能是VIM Bug]

4
我想了解vim中lookaround的行为,所以我尝试标记断言的位置。假设我有这个文件的内容:

foobar

通过执行命令:s/\(foo\)\@<!/♠ /g,我得到了:

♠ f♠ o♠ ob♠ a♠ r

为什么我在行末没有?在这种情况下,$锚是否不被视为一个位置?
相反,如果我执行此命令:%s/\(bar\)\@<=/♠ /g,我得到了:

foobar♠

有任何解释吗?请问有人能确认这种行为吗?
Vim 7.4 Ubuntu 16.04 LTS

1
我也能复现这个问题。看起来可能是一个bug。 - merlin2011
@merlin2011,感谢您的通知! - Sabrina
它在pcre中也可以重现。看起来像vim的特殊情况或错误。enter image description here - Mr.kang
1个回答

1
在你们两个的情况下,实际上是在匹配nothing,并且只是对此进行断言。 :s/\(foo\)\@<!/♠ /g的行为与更简单的:s/\zs/♠ /g一致。
♠ f♠ o♠ o♠ b♠ a♠ r

一场比赛只从现有的字符开始;每行后面的隐式换行符不计入(根据Vim的实现)。
使用第二个:%s/\(bar\)\@<=/♠ /g命令时,断言实际上就像更简单的$原子一样起作用。就像:s/$/♠ /g一样,它在断言匹配之后插入,即使在它之后只有(隐含的)尾随换行符也是如此。请保留HTML标记。
因此,尽管可能令人惊讶并与其他正则表达式引擎不一致,但你可以看到在Vim内部,这与其正则表达式引擎和缓冲区表示的内部工作方式是一致的。因此,我认为这不是一个错误。如果你仍然对此有强烈的看法,你可以在错误跟踪器上提出问题,或直接在vim_dev邮件列表上讨论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接