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

标签 regex vim vi regex-lookarounds

我想了解 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/

相关文章:

regex - SED - 替换字符串中间第一次出现的数字

vim - 删除直到下一行的第一个字符

python - 使用 Pylint 配置 ALE 插件

linux - 更改路径后 nano 不起作用

c# - 正则表达式检测单词是否是字符串的一部分并且下一个单词是否未大写

javascript - 转义不同语言中的特殊字符

vim - vim 中的 256 种颜色以及如何安装新的配色方案

macos - 粘贴到 vi 时丢失文本

python Pandas : Use regex to replace strings with hyperlink

vim - 如何在没有 %s 的情况下删除 vim 中所有突出显示的搜索结果?