Vim正则表达式列位置匹配

5
我正在学习 Vim 模式,并且对列位置匹配的定义感到非常困惑。下面我进行了一个非常简单的测试。 只需创建一个文件,在第一行第一列中输入:123456789,以便我轻松跟踪每个数字所在的列号。 然后我搜索 /.\%>3c.*\%<8c,它匹配了3456,看起来很合理,因为文档解释说 \%<8c 将匹配第7列,它的零宽度匹配,因此它只匹配到6。 但是当我搜索 /\%>3c.*\%<8c 时,这次 Vim 匹配了 4567。这次为什么它匹配到了第7列???似乎不合理。 我的 Vim 版本已经是最新:7.4,包含补丁:1-884。

2
有趣的是 - incsearch 只会突出显示 456,但结果的 hlsearch4567(7.4 补丁 1-258)。如果没有人找出问题,可能值得提交错误报告 - Amadan
2个回答

1

如果您的目标是搜索列位置大于3且小于8的内容,则无需使用点号或星号,只需使用以下代码即可:

/\%>3\%<8

如果你的问题是关于在搜索中添加点和/或星号的不直观行为,那么确实令人困惑。我认为在这种情况下,星号是多余的。你可以通过只搜索以下内容来获得与你看到的相同的行为(找到数字4-6):

/\%>3.\%<8

我认为点被视为搜索的限制条件,换句话说,在冒号位置之前必须有一个字符。因此,搜索例程运行如下:是否存在第4个列位置以第5个位置的字符结尾?是的,则将其添加到结果中;是否存在第6个列位置以第7个位置的字符结尾?是的,则将其添加;是否存在第7个列位置以第8个位置的字符结尾?不是--因为不包括第8个位置或之后的零宽度标准(\%<8)。要包括第八个位置的字符,可以在8c后再添加另一个点,然后将找到4-7,例如:

/\%3c.\%<8c.

但是请注意,这只是让我们回到了我第一个例子:

 /\%>3\%<8 <=> /\%3c.\%<8c. 

0

我认为我可能已经得到了答案。 实际上有两个匹配项,第一个匹配项是456,第二个匹配项是在第7列为空字符串。当设置hlsearch时,它将突出显示4567,因为第二个匹配项是在第7列为空字符串的匹配项,为了使匹配项明显,Vim还会突出显示该列的字符。这就是我猜测的,如果我错了,请纠正我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接