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
,但是\%(
没有对应的编号可以参考;
- 而且速度快了一点。
我必须分析一个日志文件,我正在寻找重复的模式,例如我想找到:
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
,但是\%(
没有对应的编号可以参考; - 而且速度快了一点。