找到vim中的环视位置[可能的VIM Bug]

时间:2016-12-25 05:56:19

标签: regex vim vi regex-lookarounds

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

  

foobar的

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

  

♠f♠o♠ob♠a♠r

为什么我在行尾没有 ?在这种情况下,$锚点不被视为一个位置吗?

相反,如果我执行此命令:%s/\(bar\)\@<=/♠ /g,我得到了:

  

foobar的♠

任何解释?有人可以确认这种行为吗?

Vim 7.4 Ubuntu 16.04 LTS

1 个答案:

答案 0 :(得分:1)

在您的两种情况下,您都可以有效地匹配 nothing ,并且只是围绕它进行断言。

:s/\(foo\)\@<!/♠ /g的行为与更简单的:s/\zs/♠ /g

一致
♠ f♠ o♠ o♠ b♠ a♠ r

匹配仅从现有角色开始;每行之后的隐含换行不计算(根据Vim的实现)。

使用第二个:%s/\(bar\)\@<=/♠ /g命令,断言实际上就像更简单的$原子。与:s/$/♠ /g类似,它因此在断言匹配后插入,即使它之后只有(隐式)尾随换行符。

因此,虽然可能令人惊讶且与其他正则表达式引擎不一致,但您会发现在Vim内部,这与其正则表达式引擎和缓冲区表示的内部工作方式一致。因此,我认为这不是一个错误。如果您仍然对此感到强烈,可以在bug tracker提出问题,或直接在vim_dev mailing list上讨论此问题。