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?%$)