2016-02-03 2 views
0

Я пытаюсь выделить столбцы в отдельной строке формы «выбрать», «группировать по» и «заказывать по». Как сделать предварительные пробелы необязательными?SSMS RegEx заменить на необязательную часть

Найти (требуется предшествующему пространства): ^{[ ]+}{(SELECT|GROUP BY|ORDER BY)} {[#_a-z0-5]+}

Заменить:\1\2\n\1 \3

Оригинальный запрос (только пример, без логики):

SELECT myColumn 
FROM (
    SELECT myColumn 
    FROM foo 
    GROUP BY myColumn 
    ORDER BY myColumn 
) as bar 
GROUP BY myColumn 
ORDER BY myColumn 

Результат (Failed для основного запроса):

SELECT myColumn 
FROM (
    SELECT 
     myColumn 
    FROM foo 
    GROUP BY 
     myColumn 
    ORDER BY 
     myColumn 
) as bar 
GROUP BY myColumn 
ORDER BY myColumn 

Ожидаемый результат:

SELECT 
    myColumn 
FROM (
    SELECT 
     myColumn 
    FROM foo 
    GROUP BY 
     myColumn 
    ORDER BY 
     myColumn 
) as bar 
GROUP BY 
    myColumn 
ORDER BY 
    myColumn 

ответ

2

Несколько небольших изменений в регулярных выражениях дал правильный результат для вашего примера:

{^:b*}{(SELECT|GROUP BY|ORDER BY)} {.+} 

:b соответствует пробелу или табуляции. * соответствует нулю или больше вхождений (поэтому ключевые слова в начале строк будут сопоставляться).
Я не понял цели ограничения на имена списков столбцов, поэтому заменил его на общий .+, который кажется более надежным.

Это решение, вероятно, может быть более надежной, не полагаясь на одном пространстве между ключевым словом и списком столбцов:

{^:b*}{(SELECT|GROUP BY|ORDER BY)}:b+{.+} 
1

Я думаю, вы должны использовать * квантор после [], чтобы сделать предыдущие пространства необязательно , Таким образом, выражение будет

^{[ ]*}{(SELECT|GROUP BY|ORDER BY)} {[#_a-z0-5]+} 

и заменить на тот же шаблон, который вы используете.

\1\2\n\1 \3 
Смежные вопросы