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

Iva*_*nDi 1 regex vim regex-lookarounds

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

Start ... 
some lines ... 
Start ... 
Run Code Online (Sandbox Code Playgroud)

所以为此我正在使用

/Start\_.\{-}Start
Run Code Online (Sandbox Code Playgroud)

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

Start ... 
End ... 
Start ... 
Run Code Online (Sandbox Code Playgroud)

Enr*_*lis 6

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

\n

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

\n

您甚至可以强制要求End必须位于行的开头,以防止匹配,只需在上面的正则表达式中更改End为即可。^End

\n

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

\n
Start ... here\nsome lines ...\nStart ... here\n\n\nStart ... here\nnot End...\nStart ... here\n\n\nStart ...\nEnd...\nStart ...\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
\n

Andreas Louv删除的答案使用了\\%(\xe2\x80\xa6\\)代替\\(\xe2\x80\xa6\\)。正如您在 中看到的:help E53

\n
    \n
  • 这是为了不将其计为子表达式(即连续的\\(s 对应于增加,但s 没有相应的数字可供您引用它们;\\nn\\%(
  • \n
  • 而且速度更快一点。
  • \n
\n

  • 我想你的答案比我的早几秒钟发布的。因为它们的本质是一样的,所以不妨删除一个。 (2认同)