^s*$ 是删除空行的正确正则,因它匹配含空格、制表符等所有空白字符的整行;替换时应留空而非填 ,避免多出空行。

为什么 ^s*$ 是删除空行的正确正则
空行在代码里不是“什么都没有”,而是可能包含空格、制表符或 Unicode 空白字符。直接用 ^$ 只能匹配真正“纯空”的行,漏掉大量带空白符的空行。Sublime 的正则引擎默认支持 s 匹配所有空白(包括 、
、
、全角空格等),所以 ^s*$ 才是稳妥选择。
注意:必须勾选 Sublime 左下角的 .*(正则模式)和
(跨行匹配),否则 ^ 和 $ 不会按行锚定。
替换时用什么填空?别填
,用空字符串就行
很多人习惯在替换框里填
,以为这样能“保持换行结构”,结果反而多出空行。Sublime 的替换逻辑是:把匹配到的整行(含其后的换行符)替换成你写的文本。而 ^s*$ 实际匹配的是“行首到行尾之间的内容”,不包含换行符本身——但 Sublime 在执行替换时会自动保留原有换行位置。所以:
- 替换框留空(即空字符串)→ 删除该行,上下文自然连通
- 替换框填
→ 把原行替换成一个换行符,等于凭空插入一行 - 替换框填
\n(双反斜杠)→ 会字面输出两个字符,不是换行
如何避免删掉“看似空、实则关键”的行
有些行表面空白,但实际有作用:比如 Python 的 pass 后故意换行、Jinja2 模板里的 {% endif %} 单独成行、或者 C/Java 中宏定义末尾的反斜杠续行。这类行通常不满足 ^s*$(因为含非空白字符),但如果你用了更宽泛的正则(如 ^[ ]*$),就可能误伤。
安全做法:
- 先用
Ctrl+F输入^s*$,点Find All预览匹配结果,肉眼确认是否全是真·空行 - 对配置文件或模板文件,加个负向先行断言:
^(?!s*#)s*$跳过以#开头的注释行(适用于 shell / ini 类格式) - Sublime 不支持
(? 这类复杂断言,别硬套 PCRE 写法
批量处理多个文件时,别忘了切换到 Find in Files
单文件用 Ctrl+H 即可;但要清理整个项目里的空行,得用 Ctrl+Shift+F 打开 Find in Files 面板:
- Find:
^s*$ - Where: 填路径,比如
./src/**/*.py(注意 Sublime 支持 glob,但不支持**递归除非开启recursive选项) - File name filter(可选):
*.js,*.ts,避免扫到二进制或构建产物 - 勾选
Regular expression和Replace,再点Replace
Sublime 替换后不会自动保存文件,每改完一个得手动 Ctrl+S,这点容易忽略——特别是批量操作时,改完一堆却没存,关掉就丢了。

















