^\s*$ 是唯一靠谱的删空行正则,它匹配整行仅含空白字符或为空的行,不依赖换行符类型且不跨行;其他写法如^$、\n\n、^\s*\n等均有硬伤。

直接删光所有空行,用 ^\s*$ 就够了;但必须关掉 . matches newline,且替换框绝对不能填任何字符——包括空格、\n 或不可见符号。
为什么 ^\s*$ 是唯一靠谱的写法
它匹配的是「整行内容从头到尾只有空白字符(含空格、\t、\r)或完全为空」,不依赖换行符类型,也不吃跨行内容。其他常见写法全有硬伤:
-
^$:漏掉带空格或 Tab 的“伪空行”,比如这种行根本不会被删 -
\n\n:Windows 用\r\n换行,这个表达式在 .txt 文件里大概率不匹配 -
^\s*\n:把换行符也当内容吞进去,删完可能残留错位,甚至让两行代码“粘”在一起 -
^s*$(少反斜杠):Sublime 直接不识别,查无结果
三个必踩的坑,90% 的人栽在这儿
不是正则写错了,而是面板设置和上下文干扰导致失败:
- 右下角
.*图标必须点亮(启用正则),但\n图标一定不能高亮(即禁用. matches newline) - 替换框必须彻底为空——填了
\n或一个空格,等于每删一行反而多塞一个换行,越删越多 - 中文输入法(如搜狗、百度)常劫持
Cmd+H或阻止粘贴,建议切英文输入法后手动敲^\s*$,别复制粘贴
处理特殊空白字符(全角空格、BOM、零宽空格)
网页粘贴、微信转发、Excel 导出的内容里,常藏着 \u3000(全角空格)、\uFEFF(BOM)、\u200B(零宽空格)等 \s 不覆盖的字符。这时得加料:
把查找内容换成:^[\s\u200b\uFEFF\u00a0\u3000]*$
操作前可先开 View → Show White Space(或 Ctrl+Shift+P 输入 toggle_whitespace),看行首是否显示 · 或 → —— 如果看到 U+200B 或 EF BB BF,就说明得加进表达式里。
删完末尾还剩一两个空行?这是正常现象
^\s*$ 匹配的是「有换行符的行」,而文件末尾若以 \n\n 结尾(即最后两行都是空行),最后一行可能没换行符,就无法被匹配。补救很简单:
- 把光标移到最后一行开头,按
Ctrl+Shift+K(Windows/Linux)或Cmd+Shift+K(macOS)删整行 - 这个快捷键会干净删除该行并自动补上换行符,不会让前后两行“焊”在一起
- 别用
Delete或Backspace—— 它们只删光标前字符,容易留下视觉空行
真正容易被忽略的是:删完后文件末尾可能没换行符。如果项目要求 POSIX 兼容(比如 Python 脚本、Shell 配置),记得手动补一个,或运行 Ctrl+Shift+P → Insert Final Newline。

















