Vim Regex - Как инвертировать регулярное выражение, которое соответствует нескольким строкам?

Моя цель состоит в том, чтобы регулярное выражение соответствовало всему, кроме многострочных совпадений с исходным регулярным выражением.

Это регулярное выражение, которое я пытаюсь инвертировать:

\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 очень магическая директива и избежала всего, но не повезло, получив тот же результат.

Что я делаю неправильно?
Также, если кто-то может придумать другой способ достичь того, что я пытаюсь сделать, было бы замечательно, ответ не должен следовать тому, как я это делаю.

1 ответ

Решение

Подумав, думаю, я понял, что вы имели в виду...

Эта строка должна работать для вас:

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

Обновление по комментарию:

И этот vimregex работает, если у вас есть начальные / конечные блоки TEXT:

\v(;\n\n\zs\_.{-}|%^(select)@!\_.{-})\ze(\n\_^select|\n?%$)
Другие вопросы по тегам