Regex для сопоставления чего угодно, строки, нескольких строк, включая символы новой строки, не жадные в VIM - PullRequest
1 голос
/ 21 февраля 2012

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

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

1 Ответ

1 голос
/ 21 февраля 2012

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

Регулярное выражение 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\}.
...