我正在学习 Vim 模式,并且对列位置匹配定义感到非常困惑。下面我做了一个非常简单的测试。
只需创建一个文件,在第一行第一列中输入: 123456789
。
只是让我轻松跟踪每个数字所在的列号。
然后我搜索 /.\%>3c.*\%<8c
,它匹配 3456
并且看起来很合理,因为正如文档解释的那样, \%<8c
将匹配第 7 列,并且它是零宽度匹配,因此它最多只能匹配 6 个。
但随后我搜索 /\%>3c.*\%<8c
,这次 Vim 匹配 4567
。那为什么这次匹配7???似乎不合理。
我的 Vim 版本是最新的:7.4 包含的补丁:1-884。
最佳答案
如果您的目标是搜索大于 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.
关于regex - Vim Regex 列位置匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33167214/