2012-02-21 1 views
1

Я хочу заменить прописные строки в:Regex чтобы соответствовать что-нибудь, строка, несколько строк, включая символ новой строки, не жадный в VIM

SELECT lower1, lower2, lower3 FROM lower4, lower5 WHERE 

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

:%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 
+0

Вы пытаетесь строчным все, кроме ключевых слов SQL? – JaredPar

+0

Что не так с вашим регулярным выражением? Когда я попробовал это на ваших примерах, он, кажется, делает то, что вы просили. –

+0

Я не уверен, чего вы ожидаете, но, возможно, вы хотите использовать не жадные кванторы \ {-} вместо жадного *. – Raimondi

ответ

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\}. 
+0

это работает отлично. Спасибо! – bbnn