Регулярное выражение для соответствия чему угодно, строке, нескольким строкам, включая новую строку, не жадную в VIM

Я хочу заменить строчные строки внутри:

SELECT lower1, lower2, lower3 FROM lower4, lower5 WHERE

Я использую vim replace, чтобы заменить их на верхний регистр с помощью этого регулярного выражения:

:%s/select\_.*\from\_.*\where/\U&/gic

Регулярное выражение select\_.*\from\_.*\where не подходит, когда есть другие запросы выбора:

например, он выбирает все в этом запросе и влияет на строки, которые не могут быть в верхнем регистре

SELECT lower1, lower2, lower3 FROM lower4, lower5 WHERE lower1=cannot_be_uppercased
UNION all
SELECT lower1, lower2, lower3 FROM lower6, lower7 WHERE lower1=cannot_be_uppercased

person bbnn    schedule 21.02.2012    source источник
comment
Вы пытаетесь писать в нижнем регистре все, кроме ключевых слов SQL?   -  person JaredPar    schedule 21.02.2012
comment
Что не так с вашим регулярным выражением? Когда я попробовал это на ваших примерах, кажется, что он делает то, что вы просили.   -  person Stephen Quan    schedule 21.02.2012
comment
Я не уверен, чего вы ожидаете, но, возможно, вы захотите использовать не жадные квантификаторы \ {-} вместо жадных *.   -  person Raimondi    schedule 21.02.2012
comment
Я хочу выбрать только первый SELECT ... FROM .. WHERE SELECT lower1, lower2, lower3 FROM lower4, lower5 WHERE   -  person bbnn    schedule 21.02.2012
comment
См. stackoverflow.com / questions / 1305853 / о vim и нежадном сопоставлении.   -  person Randy Morris    schedule 21.02.2012


Ответы (1)


В регулярном выражении vim есть нежадный режим. Вместо * используйте \{-}.

Регулярное выражение select\_.\{-}from\_.\{-}where, как мне кажется, это то, что вам нужно.

Вот несколько документов.

:h non-greedy

                            *non-greedy*
If a "-" appears immediately after the "{", then a shortest match
first algorithm is used (see example below).  In particular, "\{-}" is
the same as "*" but uses the shortest match first algorithm.  BUT: A
match that starts earlier is preferred over a shorter match: "a\{-}b"
matches "aaab" in "xaaab".

Example         matches ~
ab\{2,3}c       "abbc" or "abbbc"
a\{5}           "aaaaa"
ab\{2,}c        "abbc", "abbbc", "abbbbc", etc.
ab\{,3}c        "ac", "abc", "abbc" or "abbbc"
a[bc]\{3}d      "abbbd", "abbcd", "acbcd", "acccd", etc.
a\(bc\)\{1,2}d      "abcd" or "abcbcd"
a[bc]\{-}[cd]       "abc" in "abcd"
a[bc]*[cd]      "abcd" in "abcd"

The } may optionally be preceded with a backslash: \{n,m\}.
person Ade YU    schedule 21.02.2012