在Vim中匹配包含任意行与regex的表达式

时间:2013-07-04 13:45:07

标签: regex vim

在用Vim打开的文本文件中,我试图匹配两个字符串DRIVER_ACTIVITY和DriverGroup的出现,其间有任意数量的行:

2013-07-01 05:06:23,801 DRIVER_ACTIVITY
2013-07-01 05:06:23,804 text
2013-07-01 05:06:23,804 more text
2013-07-01 05:06:23,805 DriverGroup

使用:

/DRIVER_ACTIVITY(.*)DriverGroup/s  
/DRIVER_ACTIVITY((.|\n|\r)*)DriverGroup  
/\vDRIVER_ACTIVITY((.|\n|\r)*)DriverGroup  
/DRIVER_ACTIVITY\[\S\s\]*DriverGroup

没有什么比赛。如何匹配所有行/新行?

3 个答案:

答案 0 :(得分:5)

如果你想使用更常见的(...)进行分组,你需要包含\v原子来将Vim的正则表达式语法切换为“非常神奇”;否则,它是\(...\)。但是对于你的情况,Vim有一个特殊的原子匹配任意字符,包括换行符\_.,如下所示:

/DRIVER_ACTIVITY\_.*DriverGroup

无法学习Vim不同的正则表达方言;见:help pattern

答案 1 :(得分:2)

The \_s construct searches spaces including newlines

/DRIVER_ACTIVITY\(\_s\|.\)*DriverGroup

答案 2 :(得分:1)

好的,我看到了问题。在这个样本文件中,第三次尝试匹配,Ingo Karkat和Explosion Pills的建议也是如此。我没有成功的原因是因为所有这些似乎都是贪婪的。这就是为什么在“大文件”中没有一个匹配,因为它贪婪并继续观看,不会在几秒钟内返回匹配,尽管标记位于第一个匹配应出现的同一行。所以它实际匹配,但我的耐心是问题:)

我让它非贪婪而且有效: / DRIVER_ACTIVITY _ { - } DriverGroup