^\s*$ 是最稳妥的删除空白行正则,它能匹配真正空行及含空格、tab、全角空格等的伪空行,且跨平台兼容lf/crlf/cr;但需关闭. matches newline,并手动处理无结尾换行符的eof空行。

用 ^\s*$ 删除空白行最稳,但必须关掉 . matches newline,否则会跨行误删或卡死;末尾无换行符的空行它匹配不到,得手动处理。
为什么 ^\s*$ 是唯一靠谱的写法
它能同时吃掉「真正空的行」和「只有空格、Tab、全角空格、不间断空格的伪空行」。Sublime 的 \s 默认包含 \r、\n、\t、 ,不依赖换行符类型(LF/CRLF/CR),跨平台安全。
-
^$只匹配“行首紧接行尾”的行,遇到末尾没换行符的文件,最后一空行直接漏掉 -
\n\n或^$\n会受换行符影响:Windows 里\r\n\r\n不会被\n\n匹配到 -
\s*比或\t*更全面,避免漏掉混合缩进的伪空行
操作前必须确认的三件事
不是输完正则就点 Replace All —— 很多崩溃和误删都发生在这步之前。
- 看右下角状态栏:确认当前换行符是
LF、CRLF还是CR;若为CRLF,可先统一成LF(View → Line Endings → Unix (LF)) - 确保没勾选
. matches newline:这个选项一旦启用,.会吞掉换行符,导致^\s*$跨行匹配,可能把两段代码焊成一行 - 大文件(>10MB)别直接
Replace All:先按Find All看匹配数,超 5000 行就分段处理(选中一段 → 勾选In Selection)
末尾空行删不干净?不是 bug,是行为逻辑
Sublime 的 ^\s*$ 匹配的是「行内容」,不强制消耗换行符。如果文件最后一行为空且**没有结尾换行符**(即 EOF 前光标停在空行),^\s*$ 根本不会触发匹配 —— 因为那行在 Sublime 内部不被视为“有换行边界的一行”。
- 验证方法:打开控制台(
View → Show Console),输入view.substr(view.line(view.size())),返回''就说明存在这种 EOF 空行 - 解决办法只有两个:
Ctrl+End移动到行尾,按Backspace手动删;或先保存文件(强制补上换行符),再跑正则 - 别用
^\s*$(?!\n)这类 PCRE 高级语法:Sublime 默认不支持(?!断言,会报错或静默失效
想留一个空行分隔段落?别用压缩思路
用 ^\s*$\n\s*^\s*$ 替换为 \n 看似合理,但在 Sublime 里实际效果不稳定:它依赖替换引擎对连续换行的解析,不同版本表现不一,且容易在段首/段尾多留或少留。
- 更可靠的做法:先用
^\s*$全删,再人工在需要分隔的位置Enter插入单个空行 - 如果必须自动化,用两次替换:
第一次查找^\s*$\n\s*^\s*$→ 替换为\n\n(留两个换行)
第二次查找\n\n\n+→ 替换为\n\n(只保留两个)
最后手动删掉开头/结尾多余的\n\n - 注意:
\n\n在替换框里不要手敲,Sublime 会自动按当前文件换行符类型生成对应字符(LF 或 CRLF)
真正麻烦的从来不是“怎么写正则”,而是换行符隐式存在、EOF 边界模糊、大文件响应滞后这三点叠加后的连锁反应。动手前花 10 秒看一眼状态栏和文件大小,比重试五次 Replace All 更省时间。











