- 软件

电子书编辑心得

主要适用于 Calibre 自带编辑器

我是 Calibre 的重度使用者,电子书下多了,难免良莠不齐,遇见质量糟糕的孤本,找不到替代品,只能自己手动编辑,才能在阅读 App 内体验到良好的可读性。epub 电子书的标准基本上兼容 HTML + CSS,只有一小部分复杂特性不受支持,总而言之,初步掌握一些 HTML 知识,编辑电子书就绰绰有余了。

但全程手动编辑一部电子书,未免耿直过分,要提升编辑效率,正则表达式是不可不学的方便法门。当然,现在让 AI 打辅助,基本上可以搞定大部分问题,但自己毫无头绪,摸不到门道,自然也难以驾驭 AI。这里就稍作介绍,也记录一些常用的方法,以备查询。

一、正则表达式入门

古人读书,常常一边读,一边点校,风雅之士,没准还要在书斋之中焚一支熏香,备一壶茶或酒。何谓点?就是给句子在合适的地方加上标点,使句读通顺,生出节奏。何谓校?校正错漏之处。

电子书同样如此,错讹总是免不了,哪怕是作者亲自发布的文件,也免不了有拼写错误。除非是出版社经手过的,否则难免要自己编辑一下。

编辑电子书不难,但如果想提高效率,正则表达式就必须了解一下了。建议先读一些入门文章,比如菜鸟教程的正则表达式教程

在 Calibre 的编辑器里怎么用正则表达式?Ctrl+F 打开查找对话框,通常在界面底部:

查找对话框

比如我们要搜索一本书的某一章,我可以直接输入「第七章」,点击查找,程序就会跳到第七章。但如果我们想查找所有的章节呢?此时可以输入:

第[一二三四五六七八九十]章

在此点击查找,是否可以找到了?中间的方括号[]用来指定我们需要匹配的范围,因为我们匹配的是汉字数字,所以只能全部列举。如果碰到超长篇,那么就连百也要加进去。但阿拉伯数字就要简单一些,直接 [0-9] 就能匹配全部数字了。

但很快我们就会发现,第十一章就查找不到了。因为这个表达式只能匹配要给汉字,如果我们想匹配两位数甚至三位数,只要稍作修改:

第[一二三四五六七八九十]+章

加上一个加号,就可以匹配多个汉字数字了。

二、电子书手动全攻略

最方便的自然还是直接从网上下载精校精排的善本,Z-Lib,安娜档案,基本上有这两个网站也就够了。唯一的门槛也不过是翻墙的梯子而已。

但总有一些书是没有善本的,尤其是新书,大多是从首发平台上抓取的文本,又被这些盗版网站恣意置入各种丑陋的文字标记。但你又没有别的途径,快餐文字当然过目便亡,但遇见了值得玩味的文字,就只能打开工具,拾掇干净了。

1. 将文本文档转换成 epub 文档

有两种途径。

其一是直接用 Calibre 的转换书籍功能。可参考少数派这篇《借助 Calibre 处理电子书的流程和技巧》。

更多的进阶知识也可以参考以下来自书伴的文章:

其次就是我喜欢的手动处理。直接在 Calibre 左上角的「添加书籍」中选择「添加一本空白书籍」,熟练之后也可以快捷键 Ctrl+Shift+E

Screenshot 2026-06-17 104622.png

弹出对话框,自行填写内容:

image.png

在新建的电子书右键选择「编辑」,或者直接快捷键 T,即可进入电子书的编辑界面。

2. 导入 CSS 文档

3. 导入内容

粘贴文本而已。

Ctrl+C,然后保证 Ctrl+V<body></body> 范围之内。

无论是从文档中粘贴,还是网页、论坛中粘贴,基本上差不多。有一些网站防盗意识做得比较好,禁止右键复制——不过也就是防新手而已,爬虫可不管你这啊那的。

不过不同的文章或者章节,还是建议每一章都单独建立一个文件,这样导出的时候比较省心。当然,偷懒也是神圣不可侵犯的人权,无所谓的。

4. 分段

这里就需要用到正则表达式了。

查找:

(?<!>)[\n]+(?![ \t\u3000]*<[a-z])[\  ]*

替换为:

</p>\n\n<p>

段落就分好了。

然后我们就需要考虑到一种情况,即文本手动分行。比如这种:

人的皮肤之厚,大概不到半分,鲜红的热血,就循着那后面,在比
密密层层地爬在墙壁上的槐蚕〔2〕更其密的血管里奔流,散出温
热。于是各以这温热互相蛊惑,煽动,牵引,拚命地希求偎倚,接
吻,拥抱,以得生命的沉酣的大欢喜。

粗看正常,实则是多出来一大坨不必要的分行,除非屏幕的宽度、字体的大小配合得恰到好处,否则总会露馅。

在互联网早期,论坛排版相当麻烦,手动分行甚至是值得研究的细活,有大佬专门手搓小工具来做这个。但世事变迁,一些当时的权宜之计就不足为训,需要我们手动来清除了。

看起来挺简单,但转换成代码之后,实际上有各种可能。

第一种如下:

<p>人的皮肤之厚,大概不到半分,鲜红的热血,就循着那后面,在比</p>
<p>密密层层地爬在墙壁上的槐蚕〔2〕更其密的血管里奔流,散出温</p>
<p>热。于是各以这温热互相蛊惑,煽动,牵引,拚命地希求偎倚,接</p>
<p>吻,拥抱,以得生命的沉酣的大欢喜。</p>

多出来很多不必要的分段。对于段末不带标点符号,或出现的是,、;:等句中标点,则表示此处的分段错误,需要矫正。

搜索:

(?<![!。……”」: ?])</p>(\n[ \t]*)+<p[^>]*>

替换为空。

第二种如下:

<p>人的皮肤之厚,大概不到半分,鲜红的热血,就循着那后面,在比
密密层层地爬在墙壁上的槐蚕〔2〕更其密的血管里奔流,散出温
热。于是各以这温热互相蛊惑,煽动,牵引,拚命地希求偎倚,接
吻,拥抱,以得生命的沉酣的大欢喜。</p>

这种其实影响不大,HTML 会将其识别为一个正常的段落。但强迫症不能忍的是,换行处会出现多余的空格……

所以我们还是得处理掉,搜索:

([\u4e00-\u9fa5]|[\?\!\),。……)”」?!])[\n\ ]

替换为:

\1

这样也可以去除多余的空格,但不会误伤英文单词之间的空格。

还有第三种情况是:

人的皮肤之厚,大概不到半分,鲜红的热血,就循着那后面,在比<br />
密密层层地爬在墙壁上的槐蚕〔2〕更其密的血管里奔流,散出温<br />
热。于是各以这温热互相蛊惑,煽动,牵引,拚命地希求偎倚,接<br />
吻,拥抱,以得生命的沉酣的大欢喜。<br />
<br />

我的建议是单个 <br /> 直接删除,两个 <br />\n<br /> 替换为 </p>\n\n<p>

注意:记得手动补全第一个段落前面的 <p>,以及最后一个段落后面的 </p>

5. 清理

分两种,一种是冗余代码,一种是被刻意置入的网站标记、版权声明等。

5.1 去除冗余代码

因为我们已经外挂了 CSS 文件,所以每个页面内置的 CSS 代码就变得多余了,搜索:

<style(?:\s+[^>]*)?>[\s\S]*?</style>

将其替换为空格。

因为 CSS 文件中,段落只见已经预留 1em 的间隔,所以先去除不必要的分段符,Ctrl + F 搜索:

\n<p class="(whitespace|softbreak)"> </p>

确认替代栏为空,Alt + A 即可全部消除。

其次是去除不必要的 CSS 类名,Calibre 转换格式自带的类名一般前缀 calibre 加数字,所以 Ctrl + F 搜索:

 class="calibre[0-9]?"

同样 Alt + A 将其全部消除。

5.2 去除网站标记和版权声明

我们在网页上选定一段文字的时候,拷贝,粘贴,有时候会惊喜地发现文末多了个小尾巴。通常是网站的域名,或者一段版权声明,很烦人。

电子书里面,这种把戏也常见得很。碰见固定的域名或者文字还好,怕就怕加上了随即编码的。比如这样的:

笔)痴(中&amp;文bichi.me
笔`¥`痴`¥`中`¥`文www.bichi.me

理清思路,我们能判断的是开头是笔,结尾是域名 .me,英文因为有全角和半角,反而麻烦,但四个汉字「笔痴中文」是固定的。

搜索:

[^\u4e00-\u9fa5]*?[^\u4e00-\u9fa5]*?[^\u4e00-\u9fa5]*?[^\u4e00-\u9fa5]*?(?:\.|)me

替换为空,就清空了。

6. 矫正错误

6.1 把手动分行符替换成 <hr> 标签

电子书里面经常出现作者手打的分行符,但手动分行符的一大弊端是字体小了,撑不满一行,字体大了,又撑出第二行来,既不美观,也不灵活,远不如 <hr /> 标签适应性强。这些手动分行符通常有下面几种:

--------------------------------------
======================================
************************************** 
*** *** *** *** *** *** *** *** *** **

查找:

<p[^>]*>([*﹡*=—…\-\ ]{3,})</p>

替换为:

<hr />
<hr class="divider" />

6.2 修正混乱的省略号

还有一种类似的情况,属于个人的强迫症,就是省略号乱飞,逗号句号顿号各种排队串联,比如:

、、、、、
。。。。
,,,,,,

要不要修正看个人审美,查找:

([,。-、]{3,})

全部替换为标准省略号即可。不过这也是时代问题,手机输入省略号并不方便,如果都像以前,大家都用电脑,配上键盘,大概不会有这样的困扰。

6.3 修正引号

还有一种常见的错误是,一句话被分到两段里。虽然有些作家喜欢这么写,但大多可以视作排版问题,需要矫正。搜索:

([^」]*?)</p>\s*<p>([^」]*?)

替换为以下即可:

\1\2

对于不同的引号类型(""、「」、『』),分别处理比较保险。

另外一种常见错误是引号错误,正常文字应该是「这是一段话」,但有时候会变成「这段话的闭合符合不对「。

搜索:

([^」<]*?)

替换为:

\1

当然,更理想的情况是先将引号统一成一种格式,然后再将方向错误的引号修正,这样反而比较简单。

还有一种情况是,一句话当中引用的短句或者成语,引号没有正确使用,比如:

「这就是你说的「轻而易举」吗?」她嗤笑道。

正确的引号应该是:

「这就是你说的『轻而易举』吗?」她嗤笑道。

此时我们查找:

([^」]*)([\u4e00-\u9fa5]+)([^「]*)

替换为以下表达式即可:

\1\2\3

7. 格式化标题

一般来说,我会将书名设置为一级标题 H1,卷名 H2,章节名 H3,小节 H4。如果未来按照作者或者题材合并成作品集,保持同样的标准,生成目录的时候会有一种行云流水的快感。

7.1 有规律的章节标题

一般来说,我会将书名设置为一级标题 H1,卷名 H2,章节名 H3,小节 H4。如果未来按照作者或者题材合并成作品集,保持同样的标准,生成目录的时候会有一种行云流水的快感。

比如章名一般为:第一章 浮生若梦,则 Ctrl + F 搜索:

<p>第(.*?)(.*?)</p>

但这只是最理想的状况,实际上的格式是不受控制的,乱七八糟应有尽有。

光是数字就有第一章、第1章、第1章、第001章等全角半角中文数字,第1章也可能变更为(1)这样的括号,中间的空格也有可能是、,。:各种标点,甚至没有空格,后面的文本可能有,也可能没有。

然后我们还要防备一种情况,就是误判段落中含”第“与”章“的内容,有时候甚至会跨段落误判。所以我们要保证不要跨段落。

还有一种情况是章节序号之前,可能会随即出现【今日加更】之类的文字,也是我们需要考虑的。

综合以上考量,最后使用的正则表达式应该如下:

<p[^>]*>\s*[第(【][\s,、。.:]*([零一二三四五六七八九十百千万亿0-90-9]+)[\s,、。.:]*[章卷)】][\s,、。.:]*([^<]*)</p>

将其填入搜索栏,然后在替换栏填入:

<h2>第\1\2</h2>

搜索栏内的 (.*?) 即代表需要替换的内容表达式,\1\2 代表替换的第一个表达式对应的内容。

卷名或小节名同理。

7.2 无规律的章节标题

像这种有规律的章节标题还是比较好处理的,但仍然存在一些文艺青年不喜欢循规蹈矩,序号是没有的,只有一行莫名其妙的句子。往好了说是诗意,往坏了说不过是莫名其妙而已。

这种只能勉强归纳,和普通的段落比起来,文字比较简短,我们可以先假定是16个字,通常也不会出现感叹号或者问号之外的标点。

那我们可以先试试这个正则表达式:

<p[^>]*>[^<「」『』""''\n\r\*]{0,15}[^。,!?:︰∶……\*』」\.\n\r<]</p>

这种情况最好不要直接替换,而是搜索之后,确认无误,按 Ctrl+2Ctrl+3 快速设置为对应级别的标题。

7.2 验证错漏

此时可以通过编辑目录来验证标题是否齐全,或者是否有误判导致的多余标题。

生成目录之后就可以检查一遍。没有问题就算是搞定的。如果有错漏,可能是格式偏差太大,比如前面是”第一章 浮生若梦“,后面就变成”002. 事如春梦了无痕“了。

8. 最后的检校

比如 <body> 后面的段落,丢失了起始标签 <p>,例如:

<body>
人的皮肤之厚,大概不到半分,鲜红的热血,就循着那后面,在比密密层层地爬在墙壁上的槐蚕〔2〕更其密的血管里奔流,散出温热。于是各以这温热互相蛊惑,煽动,牵引,拚命地希求偎倚,接吻,拥抱,以得生命的沉酣的大欢喜。</p>

搜索:

<body[^>]*>[^<](.*?)</p>

将其替换为:

<body>\n\n  <p>\1</p>