因为^\s*--.*$仅匹配单行首的--注释,无法处理块注释、行尾注释及跨行情况,且Sublime默认不启用跨行匹配,^和$作用域限于单行,易漏匹配或误删有效语句。

为什么 ^\s*--.*$ 不能删掉所有注释行
Sublime 的正则引擎默认不匹配换行符,^ 和 $ 只作用于单行。如果 SQL 脚本里有块注释(比如 /* 这是多行注释 */)或注释后紧跟空格/制表符再换行,单纯用 ^\s*--.*$ 会漏掉很多。更关键的是,有些语句末尾带 -- 注释,直接删整行会破坏有效 SQL。
- 先用
Ctrl+H打开替换面板,勾选.*(即启用正则)和\n(即匹配换行) - 删除行首单行注释:查找
^\s*--.*$,替换为空 → 安全,只影响纯注释行 - 删除语句内尾部注释:查找
\s*--.*$(去掉^),替换为空 → 注意检查是否误删了字符串里的-- - 删除块注释:查找
/\*[\s\S]*?\*/,替换为空 → 必须启用\n选项,否则不跨行
如何避免把 INSERT INTO users (id, name) 里的括号当正则元字符处理
SQL 中大量出现 (、)、[、]、+、? 等字符,在正则里有特殊含义。Sublime 不会自动转义,一旦写成 INSERT INTO \w+ \(.*\) 却没加反斜杠,就可能匹配到意外内容,甚至崩溃(尤其大文件时)。
- 所有 SQL 字面量括号必须手动转义:
\(、\)、\[、\] - 想匹配字段列表(如
(id, name, created_at)):用\([^)]*\),别用.*,否则会贪婪跨到下一个右括号 - 批量清理多余空格前的括号:查找
\(\s+,替换为(;查找\s+\),替换为) - 如果要保留某些结构(如 JSON 字段值),先用
\"[^\"]*\"匹配双引号字符串并跳过,再处理外部语法
\bCREATE TABLE\b.*?; 为什么经常匹配不到完整建表语句
因为 .*? 默认不跨行,而真实 SQL 脚本中 CREATE TABLE 几乎总是换行写字段定义,导致非贪婪匹配在第一个换行就停了。另外 \b 在 Sublime 里对中文或特殊字符边界识别不稳定,容易漏掉以数字开头的表名(如 table_2024)。
- 启用
\n选项后,改用\bCREATE\s+TABLE\s+[^\n;]+(?:\n[^\n;]*)*;→ 明确允许换行,但止于分号 - 更稳妥的方式是分两步:先用
^\s*CREATE\s+TABLE\s+\w+定位起始行,再用列选择(Ctrl+Shift+P→ “Column Selection”)手动框选到对应; - 如果脚本含
IF NOT EXISTS或临时表(CREATE TEMP TABLE),正则得扩展为CREATE\s+(?:TEMP\s+)?TABLE - 注意:MySQL 的反引号表名(
`user_info`)需写成`[^`]*`,不能用\w+
执行替换后发现 VALUES 后面少了个换行,导致所有插入数据挤成一行
这是典型「贪婪替换」副作用。比如用 VALUES\s*\((?:[^;])*? 清洗数据部分,却没控制好结束边界,把换行符也吞掉了。Sublime 替换本身不维护格式,它只按正则结果字面替换,原换行、缩进全靠你显式保留。
- 所有涉及换行的替换,务必在替换框里显式输入
\n(而不是敲回车)—— Sublime 里敲回车是插入实际换行,不利于复用和检查 - 清洗
INSERT时,建议分三步:① 提取所有VALUES块(用VALUES\s*\([^)]*\)+\n选项);② 对每个块内部做格式化(如每行一个值);③ 再整体替换回原位置 - 大脚本慎用全局替换,先用
Find All看匹配数量,再逐个Replace确认;Sublime 对超长行(>10MB)的正则性能会明显下降 - 做完一定要用数据库客户端试运行一条
INSERT,光看语法高亮没用,有些错误(如末尾逗号、缺引号)只有执行时报错

















