<p>Sublime正则替换可提升SQL可读性:字段换行需避开函数内逗号,用,\s+(?!1*))([a-zA-Z0-9_]+)匹配并替换为,\n\t$1</code>;WHERE中AND换行用<code>\s+AND\b(?=\s+[a-zA-Z_])</code>替换为<code>\nAND</code>;删注释保留<code>-- TODO</code>用<code>^\s*--(?! TODO\b).*$\n?;Sublime不支持\K,需用捕获组替代。</p>() ↩

如何用 Sublime 的正则替换把多行 SQL 拆成单字段一行
SQL 查询里 SELECT a, b, c FROM table 经常被写成一行,但可读性差。Sublime 可以用正则一次性转成每字段独占一行,关键是匹配逗号分隔但不破坏函数内逗号(比如 COUNT(DISTINCT x))。
实际操作中,别直接上 ,\s* 全局替换——它会误切函数括号里的逗号。稳妥做法是先确保所有字段前有空格或换行,再匹配「逗号 + 可选空白 + 非右括号 + 非逗号 + 字母/数字/下划线」这种模式。
- 打开 Sublime → Ctrl+H(Windows/Linux)或 Cmd+H(macOS)调出替换面板
- 开启正则模式(点击
.*图标) - 查找:
,\s+(?![^()]*\))([a-zA-Z0-9_]+) - 替换:
,\n\t$1(保留逗号,换行缩进后接字段名) - 注意:该正则假设函数嵌套不超过一层;含两层以上括号(如
COALESCE(a, IF(b > 0, 1, 0)))需手动处理
把 WHERE 条件中的 AND 换成换行对齐格式
原始 WHERE a = 1 AND b > 2 AND c LIKE '%x%' 读起来吃力,想改成每条件一行、AND 放行首更清晰。但直接替换 AND 会误伤字段名含 and 的情况(如 column_and_value),也容易漏掉开头没空格的 AND。
更可靠的做法是锚定在 SQL 关键字边界,并利用 Sublime 的单词边界符 \b。
- 查找:
\s+AND\b(?=\s+[a-zA-Z_]) - 替换:
\nAND(注意结尾空格,保持后续字段对齐) - 执行前先 Ctrl+Shift+P → 输入
Selection: Expand Selection to Line,选中整个WHERE子句再替换,避免波及ORDER BY或注释里的AND - 如果语句含大小写混用(如
and小写),把查找式改成(?i)\s+and\b(?=\s+[a-zA-Z_])
删除 SQL 注释但保留提示性 -- TODO 行
批量清理脚本时,想删掉所有 -- xxx 行注释,又不想丢掉待办标记。Sublime 正则支持负向先行断言,能精准跳过特定前缀。
- 查找:
^\s*--(?! TODO\b).*$\n? - 替换留空
-
(?! TODO\b)确保后面不是紧接单词TODO;^和$锁定整行,\n?吸收换行避免空行残留 - 若注释在行尾(如
SELECT * FROM t; -- fetch all),用这个变体:\s+--(?! TODO\b)[^\n]*$,替换为空格(不是空字符串),防止语法错乱
为什么 \K 在 Sublime 里不能用
有人习惯在其他编辑器(如 VS Code 或 Notepad++)用 \K 重置匹配起点,写成 SELECT \K[a-zA-Z, ]+ 来只替换字段部分。但 Sublime 基于 Boost 正则引擎,不支持 \K —— 这会导致查找失败或行为异常。
替代方案是用捕获组 + 反向引用:
- 想只替换
SELECT后面的字段列表?写成:(SELECT )([a-zA-Z0-9_, \n\t]+) - 替换为:
$1\n\t$2(把字段块整体缩进) - 如果只想改字段名本身(比如加引号),就只对
$2做二次替换,例如把$2中的(\w+)替换为`$1`
真正麻烦的是嵌套括号和引号内的内容——正则无法完美解析 SQL 语法树,复杂查询建议导出到专用工具(如 DBeaver)格式化,Sublime 正则只适合结构清晰、无深层嵌套的日常调整。

















