TXT小说断章实现
2012-9-1
上个版本伊书支持TXT格式,免不了要做断章功能,粗略分享下断章的过程。
总体上的步骤很简单,只有两步:
- 用正则找出所有包含“第X章”的位置,保存在一个数组
- 循环处理这个数组,第i组的位置和第i+1组的位置之间就是这一章的内容,提取出来保存。
但有许多地方要处理和注意:
- “第”字和“章”字之间的数字不能过多,否则可能是错误的匹配。
- “第X章”这样的关键字有可能出现在正文,必须去除这样的匹配。(据测试QQ阅读没去掉这样的匹配)
- 除了“章”字,还有其他关键字,如“卷”“节”“部”等。针对以上三条,最后使用的正则:@”\\s{1}第(.{1,5})(章|节|集|卷|部|篇)”
前面的一个\\s{1}保证不匹配在正文里出现的“第X章”,中间限制1到5个字,达到中文计数的百位(如“一百二十一”),应该够了。最后收集了除了“章”之外的一些关键字,可能还不全。 - 章节标题的提取。TXT上的章节标题可能是“第X章 XXX”这样,之前匹配的只是第X章,要把后面的字也作为章节标题提取。方法是在匹配到的第X章的位置找后面30个字符内的第一个换行符,匹配到这一行的文字就是章节标题。若30个字符内没换行,就以“第X章”为标题。
- 开头结尾的特殊处理,匹配到的第一个“第X章”关键字要把这个位置之前的内容作为一章。匹配到的最后一章不再以下一个匹配的位置作结尾,而是全文最末为结尾。
- 在无法匹配到章节内容时,采用普通分段方法,把全文按每章大概固定的字数分段。这样分段时在截取固定长度的字符串后向后查找最后一个换行符,以这个换行符的位置为点分段。目前使用普通分段的情况是匹配到的章节数小于4,或章节内容过长。
经过以上这些处理后,分章是有点靠谱了,但还有一些情况没考虑到,需要慢慢完善。
很棒!加油!