^\s\*$ 是唯一能匹配真正空行和含空格/Tab的伪空行的正则,兼容LF/CRLF换行符,不跨行误删;需启用正则、禁用“. matches newline”、替换框留空。

用 ^\s*$ 正则匹配所有空白行(含“伪空行”)
直接结论:^\s*$ 是唯一能覆盖真正空行 + 带空格/Tab 的“伪空行”的正则,它不依赖换行符类型(LF/CRLF 都行),也不跨行误删。别用 ^$——它漏掉缩进空格的行;也别用 \n\n——在 Windows 下根本匹配不上 \r\n。
操作前必须确认三件事:
- 右下角
.*图标已点亮(启用正则) - 右下角
\n图标未高亮(禁用. matches newline,一勾就崩) -
Replace With框彻底为空——填\n或空格,等于每删一行反而多塞一个换行符
为什么删完还剩最后一行空行?
^\s*$ 匹配的是“有换行符边界”的行。如果文件结尾是 \n\n(最后两行都空),它能删倒数第二行;但如果结尾是 \n 且 EOF 前没换行符,最后一行就锚定失败,匹配不到。
补救方法很明确:
- 把光标移到最后一行开头
- 按
Ctrl+Shift+K(Windows/Linux)或Cmd+Shift+K(macOS) - 这个快捷键会干净删除整行(含其换行符),不会让上下两行“焊”在一起
别用 Delete 或 Backspace——它们只删字符,容易留下视觉空行。
处理网页/微信粘贴来的“隐形空行”
从网页、Excel、微信复制的内容常含 \u200b(零宽空格)、\u3000(全角空格)、\u00a0(不间断空格),\s 默认不匹配它们,导致“看着空却删不掉”。
先开 Ctrl+Shift+P → 输入 toggle_whitespace,看行首是否显示 · 或 →;若看到 U+200B 或 EF BB BF 标记,就得升级正则:
- 查找内容换成:
^[\s\u200b\uFEFF\u00a0\u3000]*$ - 仍要确保
. matches newline关闭 - 替换框依然留空
保留段落间距:压缩连续空行为单个空行
想留分隔但不要一堆空行?别用负向断言或复杂逻辑。\n{2,} 直接、安全、跨平台:
- 查找:
\n{2,}(匹配两个及以上连续换行符) - 替换:
\n\n(即保留一个空行) - 反复点
Replace All直到右下角显示0matches
注意:这个操作不处理“带空格的伪空行”,所以得先跑一遍 ^\s*$ 清干净,再跑 \n{2,} 压缩。
真正麻烦的不是正则怎么写,而是文件末尾那个没换行符的空行、Python 脚本要求 POSIX 兼容时必须结尾有换行符——删完记得手动补一个,或运行 Ctrl+Shift+P → Insert Final Newline。


















