Vim 正则表达式 - 如何反转匹配多行的正则表达式?

Vim Regex - How to invert a regex which matches multiple lines?

我的目标是正则表达式匹配除 来自原始正则表达式的多行匹配。

这是我要反转的正则表达式:

\vselect\_.{-};

它在下面的示例代码中正确匹配。
包含 sql 语句而不是大写文本。

THIS TEXT IS WHAT I WANT TO
MATCH ONCE THE ABOVE
REGEX IS CORRECTLY INVERTED.

select *
from foo
where bar;

THIS TEXT IS WHAT I WANT TO
MATCH ONCE THE ABOVE
REGEX IS CORRECTLY INVERTED.

select *
from bar
where foo;

THIS TEXT IS WHAT I WANT TO
MATCH ONCE THE ABOVE
REGEX IS CORRECTLY INVERTED.

按照 vim 文档了解如何操作 反转(否定)正则表达式,这就是我想出的:

\v^(select\_.{-};)@!.*

这个正则表达式匹配除第一行以外的所有内容 来自 sql 语句。我想要来自 sql 要排除的语句,而不仅仅是第一行。

我也尝试不使用 \v 非常神奇的指令和 逃脱了一切,但没有运气,得到相同的结果。

我做错了什么?
另外,如果有人能想到另一种方法来完成我正在尝试做的事情会很棒,答案不必遵循我正在尝试的方式。

仔细想想,我想我明白你的意思了...

这条线应该适合你:

\v;\n\n\zs\_.{-}\ze\n\_^select

根据评论更新:

如果你有 leading/ending 个文本块,这个 vimregex 就可以工作:

\v(;\n\n\zs\_.{-}|%^(select)@!\_.{-})\ze(\n\_^select|\n?%$)