我尝试将列分隔为单独的行格式"选择","分组依据" "按顺序排列"关键字。如何使前面的空格可选?
查找(需要在空格之前):
^{[ ]+}{(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
答案 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