Vim:多行搜索Aaaa一些垃圾Bbbb,但不包括介于两者之间的Cccc



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

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

因此,我使用

/Start_.{-}Start

但不幸的是,在发现这一点时,我想避免:

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

尝试使用Start(_.(End)@!){-}Start

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

您甚至可以通过在上面的regex中将End更改为^End来强制要求End必须位于该行的开头,以防止匹配。

但是,请注意,如果打开和关闭要匹配的组时确实有相同的单词,那么regex甚至在组之间也会匹配。例如,在这个中

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

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

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

正则表达式CCD_ 9将在标记为CCD_。

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


Andreas Louv删除的回答使用了%(…)而不是(…)。正如你在:help E53中看到的,

  • 这是因为不将其算作子表达式(即,连续的(s对应于n,用于增加n,但%(s没有相应的数字,您可以通过它来引用它们
  • 而且速度稍微快一点

最新更新