Vim 中的多行正则表达式支持

137

我注意到在正则表达式中跨行匹配的标准语法是使用 /s,具体如下:

This is\nsome text
/This.*text/s

这在Perl中可行,但似乎在Vim中不被支持。相反,我必须更加具体:

/This[^\r\n]*[\r\n]*text/

我找不到任何原因解释这个问题,所以我认为可能是我在vim帮助中错过了相关的部分。

有人能否确认这种行为是一方面还是另一方面?

1个回答

214

是的,Perl中的//s修饰符在Vim正则表达式中不可用。请参阅:h perl-patterns了解详情以及Vim和Perl正则表达式之间的其他差异列表。

相反,您可以使用\_.,它的意思是“匹配包括换行符在内的任何单个字符”。它比你使用的代码要短一些。请参阅:h /\_.

/This\_.*text/

5
好的 - 我的生活变得更轻松了一些。我一直在做(.|\n)* - ojrac
3
“:h /_.” 中的正斜杠是什么作用?我的意思是,我知道它有用,但为什么 “:h /_.” 有效而不是 “:h _.”? - Eddified
3
@Eddified 正斜杠(默认搜索键)指定了 \_. 的上下文,您可以这样理解:为 搜索表达式 \_. 提供帮助。 - Florian
1
然而,似乎我无法使用这个表达式进行惰性匹配,即使我将其包含在括号中?有什么办法可以做到吗? - xji
10
对于foo bar \n foo baz \n foo的惰性匹配,可以尝试使用/foo\_.\{-}foo。请注意,这只是一个翻译,不包括任何解释或其他内容。 - James M. Lay
1
Vim 有自己奥妙难解的查找替换功能,而没有标准的 PCRE 查找替换功能,这很容易成为我推荐人们使用 Vim 的最大障碍。不得不说,在 Vim 中进行查找替换绝对是领域特定知识,每一次都是如此。如果 Vim 可以在没有涉及包管理器的情况下执行 PCRE,那将改变我的生活,请告诉我是否可以实现。 - ThorSummoner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接