我必须分析一个日志文件,我正在寻找重复的模式,例如我想找到:
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没有相应的数字,您可以通过它来引用它们 - 而且速度稍微快一点