regex - Vim Regex 列位置匹配

标签 regex vim

我正在学习 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/

相关文章:

Javascript 正则表达式 - 为什么需要终止空格来匹配整个字符串

vim - vim中将光标移动到文件末尾

regex - PCRE 正则表达式替换双引号内的文本模式

regex - 仅用一个正则表达式进行多次替换

php - 组合两个正则表达式函数来剥离 html 标签

vim:在新选项卡中打开标签

vim - 为什么 vim 几乎对每个命令都使用寄存器?

regex - 带有 $> 符号的正则表达式

vim tabular 只在第一场比赛就行?

vim - 为没有扩展名的文件设置 vim 文件类型,仅