用^\s*$\n正则可精准压缩多空行为单空行或彻底删除,它匹配整行空白后跟换行符,避免\n{2,}误伤边界;处理前需统一换行符为lf、编码为utf-8,并预览确认无误。

用正则替换一次性处理多空行
Sublime Text 自带的查找替换功能就能解决,不需要插件。关键在于打开「正则表达式模式」(.* 按钮),然后输入正确的模式——不是简单匹配 \n\n,因为连续空行本质是「一个或多个换行符之间夹着零个非空白字符」。
常见错误是写成 \n\n 或 \n{2,},这只能处理两个以上连续换行,但会漏掉开头/结尾的空行边界,也可能把段落末尾的单个换行也卷进去。
- 打开
Ctrl+H(Windows/Linux)或Cmd+H(macOS) - 点击右下角
.*启用正则模式 - 查找框填:
^\s*$\n(注意末尾有换行符) - 替换框留空或填
\n(留空会删掉所有空行;填\n保留一行) - 点
All全局替换
为什么用 ^\s*$\n 而不是 \n{2,}
\n{2,} 匹配的是「两个及以上连续换行符」,但它不关心前后是否有内容,容易误伤:比如某段结尾是 \n\n,它会替换成 \n,但若前面还有文字,就变成「文字 + \n」,看起来正常;可如果文件开头是 \n\nabc,\n{2,} 会匹配开头两个 \n,删掉后变成 \nabc,开头仍有一行空行——没真正“压缩”干净。
^\s*$\n 的意思是:从行首开始,整行只有空白(含空格、制表符)或为空,然后紧接着一个换行符。它逐行匹配「空行」,且只匹配「后面还跟着内容」的空行(因为 \n 是匹配的一部分)。这样能稳定识别并清理冗余空行,同时保留段落之间必要的单空行。
- 若想保留段落间**恰好一行**空行,用
^\s*$\n→\n - 若想彻底**去掉所有空行**,替换为「空」即可
- 若文件含 Windows(
\r\n)换行,需改用^\s*$(\r\n|\n),否则可能漏匹配
批量处理多个文件时注意编码和换行符一致性
如果你用 Find in Files(Ctrl+Shift+F)跨文件操作,结果可能因文件编码或换行符不同而异常。比如 UTF-8 with BOM 文件里,^\s*$ 可能被 BOM 干扰;又或者混合了 \r\n 和 \n,导致部分空行不被匹配。
- 先统一目标文件的换行符:选中全部文本 →
View → Line Endings → Unix (LF) - 确保文件编码为 UTF-8:菜单
File → Save with Encoding → UTF-8 - 在
Find in Files的「Where」框中指定路径,避免递归过深导致卡顿 - 替换前务必点
Find All预览匹配项,确认没误伤代码注释或模板中的空行
别忽略编辑器设置对空行显示的影响
有时候你以为有多空行,其实是 Sublime 的 draw_white_space 或 trim_trailing_white_space_on_save 设置在干扰判断。比如开启了 draw_white_space,空格和制表符会显示为小点或竖线,让你误以为某行“不是空行”,其实它是含空格的伪空行。
- 检查当前设置:
Preferences → Settings,搜draw_white_space,临时设为"none" - 确认是否启用了自动删尾随空格,它可能在保存时悄悄改变行内容,影响你对空行数量的判断
- 如果处理的是 Markdown 或 HTML 源码,注意某些语法(如 Markdown 的段落分隔)依赖空行,删过头会导致渲染异常
真正麻烦的不是怎么写正则,而是得先分辨清楚:哪些空行是格式冗余,哪些是语义必需。动手前花十秒看一眼上下文,比跑十次替换更省时间。











