SQL格式化可用Sublime正则实现:1.用(?i)(\s+)(SELECT|FROM|JOIN|WHERE|GROUP\s+BY|ORDER\s+BY|HAVING|LIMIT)→\n $2统一子句换行缩进;2.用,\s+(?=[a-zA-Z0-9_])→,\n拆分字段;3.用[ \t]+$和\n\s*\n清理空格与空行。

SQL语句换行缩进:用 ^ 和 \n 匹配行首再插入缩进
Sublime 的正则替换不能直接“智能缩进”,但能靠定位关键词前的换行来批量加空格。关键是把 SELECT、FROM、WHERE 等子句强制换到新行,并统一缩进 4 个空格。
先用这个正则匹配所有可能被挤在一行的子句开头:
(?i)(\s+)(SELECT|FROM|JOIN|WHERE|GROUP\s+BY|ORDER\s+BY|HAVING|LIMIT)
替换为:
\n $2
注意:(?i) 启用忽略大小写;\s+ 捕获前面可能的空白(包括换行),避免重复缩进;$2 是子句本身,不带原始空白。
- 如果原语句是
SELECT a FROM t WHERE x=1,会变成四行,每行以 4 空格开头 - 若已有换行但缩进不一致(比如
WHERE前只有 2 空格),该规则仍会覆盖成 4 空格 - 别忘了勾选 Sublime 替换面板右下角的
.*(启用正则)和Aa(忽略大小写)
逗号分隔字段换行:匹配 , 后非空格字符再换行
字段列表常写成 col1, col2, col3,想改成每字段一行,不能简单搜 , —— 那会把 WHERE a = 1, b = 2 也拆开。
安全做法是只匹配“逗号 + 可选空白 + 字母/数字/下划线”这种组合:
,\s+(?=[a-zA-Z0-9_])
替换为:
,\n
(?=[a-zA-Z0-9_]) 是正向先行断言,确保逗号后面确实跟着字段名,而不是运算符或关键字。
- 对
SELECT id, name, created_at FROM users有效,变成三行字段 - 对
WHERE price > 100, status = 'active'不触发,因为>后不是字母数字 - 如果字段含函数如
UPPER(name),需额外处理括号内逗号,此时建议手动或分步处理
清理多余空行和首尾空白:用 \s*\n\s* 一次收尾
格式化后常残留空行或行尾空格,影响可读性。Sublime 支持多行匹配,但要注意顺序 —— 先删行尾空格,再压空行,否则空行里带空格会漏掉。
第一步:删所有行尾空白(含制表符和空格)
[ \t]+$
替换为空(直接留空)
第二步:合并连续空行(保留最多一个)
\n\s*\n
替换为:
\n\n
注意:\s* 包含换行符,所以它实际匹配“换行 + 任意空白(含换行) + 换行”,最终压缩为两个换行(即一个空行)。
- 别用
\n{2,},它不匹配中间有空格的空行 - 如果文件末尾有多余换行,可用
\n+$单独删掉 - 执行前建议
Ctrl+Shift+P→Convert Indent to Spaces统一缩进类型
WHERE 条件拆分失败?检查括号和字符串里的 AND/OR
想把 WHERE a=1 AND b=2 OR c=3 拆成多行时,直接搜 \s+(AND|OR)\s+ 很危险 —— 它会误切 'user AND pass' 或 CREATE INDEX idx_on_and。
Sublime 正则不支持平衡括号匹配,所以无法完美跳过字符串和括号内容。务实方案是:
- 先人工确认 WHERE 子句无嵌套字符串/注释干扰,再执行
\s+(AND|OR)\s+→\n $1 - 更稳妥的做法:把整个 WHERE 写成一行,再用列编辑(鼠标按住
Alt拖选)在每个AND前插入换行+缩进 - 如果 SQL 来自程序拼接(含变量占位符),正则基本不可靠,应改用专用 SQL 格式化工具(如 pgFormatter、sqlparse)
正则只是辅助,真正复杂的 SQL 结构(子查询、CTE、窗口函数)靠它硬搞,很快就会遇到括号不匹配、引号嵌套、注释吞掉关键字等问题。

















