删空行唯一可靠正则为^\s\*$,需启用正则且禁用“.”匹配换行;清乱码须显式添加\u200b、\uFEFF等Unicode字符;压缩多空行为单空行需分两步执行,顺序不可颠倒。

直接结论:删空行用 ^\s*$,清乱码得加 Unicode 字符集;别信“一键全删空白”,那会把缩进和段落结构一起抹掉。
为什么 ^\s*$ 是唯一靠谱的空行匹配写法
空行不是“没内容”,而是“只有不可见字符”。^$ 只能抓到真正空的行,但网页、微信、TXT 小说里大量存在带空格、Tab、全角空格(\u3000)、零宽空格(\u200b)的“伪空行”,^$ 完全失效。^\s*$ 中的 \s 默认覆盖空格、\t、\r、\n,逻辑干净,不跨行、不吞内容、跨平台安全。
- 务必勾选右下角
.*图标启用正则,但一定不要勾选.matches newline——否则^\s*$会跨行误匹配 - 替换框必须彻底留空;填
\n或空格会导致每删一行反而多塞一个换行,越删越多 - 文件末尾若无换行符(即最后一行为空但 EOF 前没
\n),^\s*$匹配不到——这时用Ctrl+Shift+K(Windows/Linux)或Cmd+Shift+K(macOS)手动删该行
处理网文常见乱码:从 \u200b 到 \uFEFF 都得显式写进正则
小说 TXT 从网页、微信、EPUB 导出时,常埋着 \u200b(零宽空格)、\uFEFF(BOM)、\u00a0(不间断空格)、\u3000(全角空格)等 \s 不覆盖的字符。它们不会被 ^\s*$ 清掉,还会导致段落错位或渲染异常。
- 先开
View → Show White Space,看行首是否显示·或→;有就说明含隐形字符 - 查找内容换成:
^[\s\u200b\uFEFF\u00a0\u3000]*$,替换框仍留空 - 如果发现某段文字莫名断行或对不齐,复制粘贴到在线 Unicode 查看器(如 bnfparser.github.io/unicode)确认是否含
\u2028(行分隔符)或\u2029(段落分隔符)——这些也得手动加进方括号里
保留段落间距:压空行不能靠猜,顺序和写法都关键
纯文本小说里,单个空行是段落分隔符,删光会导致全文连成一块。想压缩“多个空行”为“一个空行”,不能只跑一次 \n{3,} → \n\n,否则开头结尾的空行、跨平台换行符差异会让结果不可控。
- 第一步:执行
\n{3,}→\n\n,把 ≥3 个连续换行压成两个 - 第二步:执行
\n\n(?=\n)→\n,把后面还跟着换行的\n\n变成单个\n,最终只留一个空行 - 顺序不能反——否则第二步会把刚压好的
\n\n又拆开;且两步都需勾选.*,不勾.matches newline
批量操作前最容易被忽略的三件事
大文件或整批小说 TXT 处理时,出错不是正则写错了,而是环境或边界没验证:
- 中文输入法(如搜狗、百度)常劫持
Cmd+H或阻止粘贴,建议切英文输入法后手动敲^\s*$,别复制粘贴 - 用
Find All(Alt+Enter)先看匹配了多少处——如果 Python 代码里缩进行也被标中,说明你忘了关.matches newline - 执行
Replace All前务必Ctrl+S保存当前文件;崩溃或误操作后,Sublime 不一定自动恢复未保存内容
真正麻烦的从来不是正则怎么写,而是文件末尾那个看不见的空行、段落间混着全角空格的“伪空行”、以及不同来源带来的隐性 Unicode 差异——这些地方不手动点开 Show White Space 看一眼,很容易以为格式化完了,结果导入排版工具或生成 EPUB 时才发现段落全塌了。



















