Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在这种情况下,为什么vim在\ze之后使用模式?_Regex_Vim_Regex Lookarounds - Fatal编程技术网

Regex 在这种情况下,为什么vim在\ze之后使用模式?

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,)必须将一些以太匹配

仅供参考,这个问题源于

给定一个5列CSV行,其中所有5列都为空,即仅包含
,,,
,我认为以下
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是的。在这种情况下,“消耗非零宽度的东西”只是向前移动一个。这至少是我对这个问题的最佳猜测。目前这似乎是最好的答案;认可的。