SSMS RegEx 替换为可选部分

SSMS RegEx replace with optional part

我试图将列分隔成单独的行形式 "select"、"group by" 和 "order by" 关键字。如何使前面的空格可选?

Find(需要前置空格): ^{[ ]+}{(SELECT|GROUP BY|ORDER BY)} {[#_a-z0-5]+}

替换为: \n

原始查询(只是一个没有逻辑的例子):

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

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

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

:b 匹配 space 或制表符。 * 匹配零次或多次出现(因此将匹配行开头的关键字)。
我不明白对列列表名称进行限制的目的,因此将其替换为通用的 .+,这似乎更可靠。

如果不依赖关键字和列列表之间的单个 space,此解决方案可能会变得更加稳健:

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

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

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

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

\n