解决下载的电子书中换行的问题

我在网上看小说时,习惯把它先全部下载到本地来看(一般自己写个蜘蛛程去抓)。貌似是为了防止把html页面中表格撑爆,许多小说每隔几十个字符固定换行,这样下载到本地的时候看起来就很不爽,因此我就写了个程序将这些换行的文本来合并一下。

基本原理如下:

  1. 通过trim函数去掉多余的空格
  2. 如果旧行是以标点符号结束,则认为是段落结束,需要加换行符,否则则去掉原来的换行符。

代码实现如下:

    static void Main(string[] args)
    {
        var lines = File.ReadAllLines(@"r:\1.txt",Encoding.Default);
        File.WriteAllLines(@"r:\2.txt",JoinLine(lines));
    }

    static string[] JoinLine(string[] lines)
    {
        var newLine = from line in lines
                     select Regex.Replace(line.Trim(), @"(.+\W)$", m => m.Groups[1].Value + "\n");

        return string.Join("", newLine.ToArray()).Split('\n');
    }

这个以标点符号是否为结束符来合并的算法没有什么大问题,但有一个地方无法解决,那就是"第一章 xxxxx"这样的标题栏实际上还是应该换行的,但上面的算法把它和下面的行合并了起来。因此我将其算法又改进了一下,添加了一个可以自己某些特殊行的条件检查,最终版本如下:

    static void Main(string[] args)
    {
        var lines = File.ReadAllLines(@"r:\1.txt",Encoding.Default);
        File.WriteAllLines(@"r:\2.txt", JoinLine(lines, line => Regex.Match(line, "
.+?").Success));
    }

    static string[] JoinLine(string[] lines,Func<string,bool> exceptHanlder)
    {
        Func<string, string> GetNewLine = s => s + "\n";

        var newLineQuery = from line in lines.Select(i => i.Trim())
                         let newLine = Regex.Replace(line, @"(.+\W)$", m => GetNewLine(m.Groups[1].Value))
                         select exceptHanlder(newLine) ? GetNewLine(newLine) : newLine;

        return string.Join("", newLineQuery.ToArray()).Split('\n');
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值