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)
尝试使用Start\\(\\_.\\(End\\)\\@!\\)\\{-}Start.
我基本上只是将您的更改\\_.为更复杂的内容,即\\(\\_.\\(End\\)\\@!\\),匹配不匹配的\\_.地方。End
您甚至可以强制要求End必须位于行的开头,以防止匹配,只需在上面的正则表达式中更改End为即可。^End
但请注意,如果您确实使用相同的单词来打开和关闭要匹配的组,则正则表达式甚至会在组之间进行匹配。例如,在这个
\nStart ... here\nsome lines ...\nStart ... here\n\n\nStart ... here\nnot End...\nStart ... here\n\n\nStart ...\nEnd...\nStart ...\nRun Code Online (Sandbox Code Playgroud)\n正则表达式Start\\(\\_.\\(^End\\)\\@!\\)\\{-}Start将匹配标记为 的四行here。
因此,如果您可以编写一个re1仅匹配开头的正则表达式,一个re3仅匹配结尾的正则表达式,以及一个匹配re2您不想匹配的内容的正则表达式,那么您可以将它们合并到re1\\(\\_.\\(re2\\)\\@!\\)\\{-}re3.
Andreas Louv删除的答案使用了\\%(\xe2\x80\xa6\\)代替\\(\xe2\x80\xa6\\)。正如您在 中看到的:help E53,
\\(s 对应于增加,但s 没有相应的数字可供您引用它们;\\nn\\%(