最稳方法是用 ^\s*$ 替换为空:^ 匹配行首,\s* 匹配零个或多个空白字符(空格、tab等),$ 匹配行尾,可安全删除纯空行及含空白符的“伪空行”,不误删有内容的缩进行。

匹配并删除空行或只含空白字符的行
Sublime Text 的正则替换能直接干掉无意义的空行,但得小心别误删带缩进的代码行。关键是用 ^\s*$:其中 ^ 匹配行首,\s* 匹配零个或多个空白字符(包括空格、制表符、换行符),$ 匹配行尾。这个组合只命中真正“空”的行,不会碰 return true; 这种有内容但带缩进的行。
操作时打开「Find → Replace」(Ctrl+H / Cmd+H),勾选「Regular Expression」,查找框填 ^\s*$,替换框留空,点「Replace All」。注意:如果文件末尾有连续多个空行,它会全部清掉——这是预期行为,不是 bug。
删除包含特定关键词的整行(如注释或调试语句)
想批量删掉所有 // TODO 行,或者所有 console.log(...)?用 ^.*TODO.*$ 或 ^.*console\.log\(.*\).*$。重点在行首 ^ 和行尾 $,确保整行被匹配,避免只删掉某一行里的局部字符串。
容易踩的坑:
- 点号
.默认不匹配换行符,所以^.*TODO.*$安全;但如果关键词跨行(极少见),这个正则就失效了 - 括号、点号等特殊字符要转义,比如
console.log()必须写成console\.log\(\) - 大小写敏感默认开启,删
DEBUG时如果文件里混着debug,得点开「Match Case」开关或改用(?i)^.*debug.*$
保留某些行、删除其余所有行(反向筛选)
这不是“删除”,而是“提取”——用正则把不想留的行替换成空,相当于反向过滤。例如只保留含 function 或 class 的行,其余全删:查找框填 ^(?!.*\b(function|class)\b).*\R,替换框留空。
说明:(?!...) 是负向先行断言,\b 是单词边界,\R 匹配任意换行符(兼容 \r\n、\n)。这个表达式意思是:“匹配那些从行首开始、后面不跟 function 或 class 单词的整行 + 换行符”。
⚠️ 注意:如果最后一行没换行符,它可能被漏掉;建议先用 File → Save with Encoding → UTF-8 确保结尾有换行,再执行。
删除行首/行尾多余空白,同时保留非空行
纯删空行太粗暴,有时你只想清理缩进混乱——比如把 hello 变成 hello。用两个替换更稳:
第一步删行首空白:^\s+ → 空
第二步删行尾空白:\s+$ → 空
为什么分两步?因为 ^\s+\s+$ 会跳过像 a b 这种中间有空格的正常内容行,而 ^\s+|\s+$(用竖线表示“或”)在 Sublime 中支持,但实测部分版本对 | 解析不稳定,稳妥起见还是分两次跑。
另外,\s 在 Sublime 正则中**不包含换行符**,所以不会误伤行结构——这点和 JavaScript 的 /\s/g 不同,别套用前端经验。
复杂点在于混合场景:比如你要删空行、删注释行、再 trim 剩余行首尾空格。这三个动作不能合并成一个正则,顺序也重要——先删行,再 trim,否则删完空行后,原空行位置的换行符残留可能影响 trim 效果。











