Vim Regex列位置匹配

时间:2015-10-16 09:42:29

标签: regex vim

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

2 个答案:

答案 0 :(得分:1)

如果您的目标是搜索大于3且小于8的列位置,则不需要点或星号,这就足够了:

/\%>3\%<8

如果您对在搜索中添加点和/或星星的不直观行为有疑问,那么是的,这是令人困惑的。我相信在这种情况下,明星是多余的。只需搜索:

,您就可以获得与之相同的行为(数字4-6找到)

/ \%GT; 3 \%LT; 8

我认为点被认为是搜索的限制性标准。换句话说,列位置必须有一个字符。所以搜索例程运行如下:是否有一个列位置4,其中一个字符位于第五位?是的,将其添加到结果中;列位置6是否在第7位有一个字符?是的,加上它;是否有一个列位置7,第8个位置有一个字符?否 - 因为零宽度标准不包括第8个位置或更高位置(\%&lt; 8)。要将字符包含在八个位置,可以在8c之后添加另一个点,然后找到4-7,例如:

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

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

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

答案 1 :(得分:0)

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