我想了解 vim 中环视的行为,因此我尝试标记断言的位置。假设我有这个文件的内容:
foobar
通过执行此命令:s/\(foo\)\@<!/♠ /g
我得到:
♠ f♠ o♠ ob♠ a♠ r
为什么我没有 ♠
在行尾?是$
在这种情况下, anchor 不被视为位置?
如果我执行此命令 :%s/\(bar\)\@<=/♠ /g
我得到:
foobar♠
有什么解释吗?有人可以确认这种行为吗?
<小时/>Vim 7.4 Ubuntu 16.04 LTS
最佳答案
在这两种情况下,您实际上都没有匹配任何内容,并且只是围绕它进行断言。
: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上讨论这个问题.
关于regex - 找到 vim 中的环视位置 [可能的 VIM Bug],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41319006/