【问题标题】:SSMS RegEx replace with optional partSSMS RegEx 替换为可选部分
【发布时间】:2016-02-03 08:29:10
【问题描述】:

我正在尝试将列分隔为单独的行形式“select”、“group by”和“order by”关键字。如何使前面的空格可选?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    通过不依赖关键字和列列表之间的单个空格,这个解决方案可能会变得更加健壮:

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

    【讨论】:

      【解决方案2】:

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

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

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

      \1\2\n\1  \3
      

      【讨论】:

        猜你喜欢
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多