查空行别用^$,它无法识别带空格、Tab、全角空格等“伪空行”;应使用^\s*$,并确保正则启用、.matches newline关闭、替换框为空;对Unicode不可见字符需扩展为^[\s\u200b\uFEFF\u00a0\u3000]*$。

查空行别用 ^$,它根本认不出“伪空行”
直接后果是:带空格、Tab、全角空格的行完全逃过匹配,删完还剩一堆“看着空、实际有字符”的行。因为 ^$ 只匹配「行首紧接行尾」的绝对空行,对缩进或粘贴残留的空白零容忍。真实项目里,这类“伪空行”占空行总量 70% 以上,尤其来自网页复制、Excel 导出或中文输入法。
正确做法是用 ^\s*$:
- \s 覆盖空格、\t、\r、\n,天然兼容 LF/CRLF/CR
- ^ 和 $ 锚定整行,不跨行、不吞换行符
- 不依赖文件末尾是否有换行符,EOF 前的空行也能命中
^\s*$ 失效?先看右下角三个开关状态
90% 的“正则没反应”不是写错了,而是面板配置冲突:
- 右下角
.*图标必须点亮(启用正则) - 右下角
\n图标一定不能高亮(即禁用. matches newline)——一勾上,^和$就失效,可能整段被误删 -
Replace With框必须彻底为空:填\n或一个空格,等于每删一行反而多塞一个换行,越删越多
中文/网页粘贴内容藏了哪些“隐形空行”?
普通 \s 不覆盖这些字符,它们会让行“看起来空”,但 ^\s*$ 完全匹配不到:
- 全角空格:
\u3000 - BOM:
\uFEFF - 零宽空格:
\u200B - 不间断空格:
\u00A0
验证方法:按 Ctrl+Shift+P 输入 toggle_whitespace,打开空白符显示。如果看到行首出现 ·、→ 或标记 U+200B/EF BB BF,就得升级正则:
把查找内容换成:^[\s\u200b\uFEFF\u00a0\u3000]*$
注意:仍要确保 . matches newline 关闭,否则加料后行为不可控。
删完末尾还剩一个空行?这不是 bug,是锚定逻辑
^\s*$ 匹配的是「有明确行边界」的空行。如果文件结尾是 \n\n(最后两行都空),它能删掉倒数第二行;但如果结尾是 \n 且 EOF 前没有换行符(即最后一行为空但无结尾 \n),Sublime 内部不认为这是“一行”,所以不触发匹配。
补救操作只有两个可靠方式:
- 光标移到最后一行开头,按
Ctrl+Shift+K(Windows/Linux)或Cmd+Shift+K(macOS)——这个快捷键删整行并自动补换行符,不会让上下文“焊”在一起 - 或者先保存文件(强制补上结尾换行符),再跑一次
^\s*$
真正容易被忽略的是:删完后文件末尾可能没换行符。Python 脚本、Shell 配置等 POSIX 场景要求文件以换行符结尾,记得手动补或运行 Ctrl+Shift+P → Insert Final Newline。











