Regex 在这种情况下,为什么vim在\ze之后使用模式?
仅供参考,这个问题源于 给定一个5列CSV行,其中所有5列都为空,即仅包含Regex 在这种情况下,为什么vim在\ze之后使用模式?,regex,vim,regex-lookarounds,Regex,Vim,Regex Lookarounds,仅供参考,这个问题源于 给定一个5列CSV行,其中所有5列都为空,即仅包含,,,,我认为以下vim-ex命令应在所有5个位置插入hello: :s/\v(^|,)\ze(,|$)/\1hello/g 然而,它不是,因为输出是 hello,,hello,hello,hello 插入第一个hello,因为^\ze,在行首匹配。但是,该,似乎被命令使用。是这样吗?如果是,为什么?我不确定答案,但我可以分享一个预感。我认为这可以归结为完全零宽度的匹配/替换模式(例如,/^\ze,)必须将一些以太匹配
,,,
,我认为以下vim
-ex
命令应在所有5个位置插入hello
:
:s/\v(^|,)\ze(,|$)/\1hello/g
然而,它不是,因为输出是
hello,,hello,hello,hello
插入第一个
hello
,因为^\ze,
在行首匹配。但是,该,
似乎被命令使用。是这样吗?如果是,为什么?我不确定答案,但我可以分享一个预感。我认为这可以归结为完全零宽度的匹配/替换模式(例如,/^\ze,
)必须将一些以太匹配索引移动1,即使从技术上讲它没有消耗任何东西。这样,它仍然可以进行下一场比赛,否则它只会保持在相同的位置匹配(如果有意义的话)
你的例子似乎证明了这一点。下面是一个更具说明性的示例(更改输入以更好地显示匹配的内容)
发出以下命令:
:s/\v(^ |.)\ze(.|$)//g
在输入行abcd
上运行它将输出:
a
注意a
是如何匹配/替换的(在
中),以及是如何不匹配的,如a
中的a
所示。这可防止ab
对被匹配/替换
我能想到的唯一能解释这一点的方法是,在与/^\ze的第一个零宽度模式匹配后,某些匹配光标或匹配索引必须移过a
的第一个字符。
换言之:
输入:abcd
命令:s/\v(^ |.)\ze(.|$)//g
======================================
匹配/替换1:
abcd=>abcd
^ ^
匹配/^ze。
将在零宽度/^\ze后将光标移动1。匹配(否则会卡在那里)
----------------
匹配/替换2:
abcd=>acd
^ ^
匹配/\ze。
使用“.”(在本例中为“b”)。不完全是零宽度。
... 等等
不知道为什么,但是:%s/\v(^ |,)@@WiktorStribiż从我链接的答案中可以看出,避免运行命令两次正是我问这个问题的原因。是的,在匹配行尾的零长度字符串时,除了速记以外的所有内容都有问题,只有像:%s/\\u w*/hello/g
这样的东西才能工作。因此,您的观点是,该算法能够继续前进而不会陷入困境的唯一方法是,它总是消耗一些非零宽度的东西。由于第一个匹配项是^\ze,
,且宽度为零,因此引擎将强制消耗,
以通过开头。是吗?@EnricoMariaDeAngelis是的。在这种情况下,“消耗非零宽度的东西”只是向前移动一个。这至少是我对这个问题的最佳猜测。目前这似乎是最好的答案;认可的。