SSMS RegEx替换为可选部件

时间:2016-02-03 08:29:11

标签: sql-server regex replace ssms sql-server-2014

我尝试将列分隔为单独的行格式"选择","分组依据" "按顺序排列"关键字。如何使前面的空格可选?

查找(需要在空格之前): ^{[ ]+}{(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

结果(主查询失败):

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 个答案:

答案 0 :(得分:2)

正则表达式的一些小改动为您的示例提供了正确的结果:

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

:b匹配空格或制表符。 *匹配零次或多次(因此匹配行的开头的关键字) 我不明白限制列列表名称的目的,所以用通用.+替换它,这似乎更可靠。

通过不依赖关键字和列列表之间的单个空格,可以使此解决方案更加健壮:

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

答案 1 :(得分:1)

我认为你应该在[]之后使用*量词来使前面的空格可选。所以表达式将是

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

并替换为您正在使用的相同模式。

\1\2\n\1  \3