用 ^\s*$ 配合关闭 . matches newline 并清空替换框,可精准删除所有视觉空行;^$ 漏删含空白行,\n\n^$ 跨平台失效且误删;sublime 中 \s 不含全角/零宽空格,需手动添加;务必点亮正则、禁用 . 匹配换行、替换框留空。

直接结论:用 ^\s*$ 配合关闭 . matches newline,替换框留空,就能真正一键删掉所有“视觉空行”,包括带空格、Tab、甚至不可见 Unicode 空白的伪空行;其他写法不是漏删就是误删。
为什么必须用 ^\s*$,而不是 ^$ 或 \n\n
^$ 只匹配“行首紧接行尾”的绝对空行,只要某行末尾多一个空格或 Tab,它就完全失效;\n\n 依赖换行符字面量,在 Windows 的 \r\n 文件里基本不匹配,且会把段落间合法的单空行也卷进去删。而 ^\s*$ 中的 \s 默认覆盖空格、\t、\r、\n 等,^ 和 $ 在 Sublime 里按行锚定,天然跨平台、不跨行、不吞内容。
-
^\s*$匹配的是“整行内容只有空白字符”,不是“有没有换行符” - 它不强制消耗换行符本身,所以不会导致上下两行“焊”在一起
- Sublime 的
\s不包含全角空格(\u3000)、零宽空格(\u200b)等,这些得手动加进表达式里
三个必关/必做设置,否则正则根本不起作用
不是正则写错了,而是环境没调对——90% 的失败都卡在这三步:
- 右下角状态栏的
.*图标必须点亮(启用正则),但旁边的\n图标一定不能高亮(即禁用. matches newline) -
Replace With框必须彻底为空——填\n、空格、甚至不可见字符,都会让每删一行反而多塞一个换行,越删越多 - 中文输入法(如搜狗、百度)常劫持
Cmd+H或阻止粘贴,建议切英文输入法后手动敲^\s*$,别复制粘贴
删完末尾还剩一两个空行?这不是 bug,是行为逻辑
^\s*$ 匹配的是“有换行符边界”的行。如果文件以 \n\n 结尾(即最后两行都是空行),它能删掉倒数第二行;但如果 EOF 前只有 \n(最后一行为空但无结尾换行符),这行在 Sublime 内部不被视为“可被 ^/$ 锚定的一行”,自然不匹配。
- 补救方法很简单:光标移到最后一行开头,按
Ctrl+Shift+K(Windows/Linux)或Cmd+Shift+K(macOS)删整行 - 这个快捷键会干净删除该行并自动补上换行符,不会破坏上下文
- 别用
Delete或Backspace—— 它们只删光标前字符,极易留下“看着空、实则含隐形字符”的行
处理网页粘贴、Excel 导出等脏数据时要加料
从网页、微信、Excel 粘过来的内容,常藏有 \u200b(零宽空格)、\uFEFF(BOM)、\u00a0(不间断空格)、\u3000(全角空格)等 \s 不覆盖的字符。这时得扩展正则:
- 先开
View → Show White Space(或Ctrl+Shift+P输入toggle_whitespace),看行首是否显示异常标记 - 若看到
U+200B或EF BB BF,就把查找内容换成:^[\s\u200b\uFEFF\u00a0\u3000]*$ - 仍要确保
. matches newline关闭,否则整个表达式行为不可控
真正容易被忽略的,是删完后文件末尾可能没了换行符——尤其当项目要求 POSIX 兼容(比如 Python 脚本、Shell 配置),记得手动补一个,或运行 Ctrl+Shift+P → Insert Final Newline。











