Vim: 多行搜索 Aaaa 一些垃圾 Bbbb 但不是中间有 Cccc

Vim: multiline search for Aaaa some garbage Bbbb but not with Cccc in between

我必须分析一个日志文件,我正在寻找重复的模式,例如我想找到:

Start ... 
some lines ... 
Start ... 

为此我正在使用

/Start\_.\{-}Start

但不幸的是我也发现了这个,我想避免:

Start ... 
End ... 
Start ... 

试试 Start\(\_.\(End\)\@!\)\{-}Start

我基本上只是将您的 \_. 更改为更复杂的内容,即 \(\_.\(End\)\@!\),它匹配 \_.,其中 End 匹配。

您甚至可以通过在上面的正则表达式中将 End 更改为 ^End 来强制 End 必须位于行的开头以防止匹配。

但是请注意,如果您确实使用相同的词来打开和关闭要匹配的组,那么正则表达式甚至会在组之间进行匹配。例如,在这个

Start ... here
some lines ...
Start ... here


Start ... here
not End...
Start ... here


Start ...
End...
Start ...

正则表达式 Start\(\_.\(^End\)\@!\)\{-}Start 将匹配标记为 here.

的四行

因此,如果您可以编写一个仅匹配开头的正则表达式 re1,一个仅匹配结尾的正则表达式 re3,以及一个与您不匹配的正则表达式 re2不想匹配,那么可以组合成re1\(\_.\(re2\)\@!\)\{-}re3.


Andreas Louv 删除的答案使用 \%(…\) 而不是 \(…\)。正如您在 :help E53

中所见
  • 那是为了不把它算作子表达式(即连续的 \(s 对应于 \<i>n</i> 增加 n,但是\%(没有对应的编号可以参考;
  • 而且速度快了一点。