有没有较好的方法解决文本"意外"换行的?

一般是网页上的小说被直接复制到TXT文本中的
1,估计是作者码文时在Word中设置了间距
2,然后直接复制到网页中发布.
3,最终被整理的人直接大网页中复制到TXT文本中

到这还是没啥大问题的,在网页中阅读和在TXT中阅读有"意外换行"作为辅助其实还好
但是TXT到一些阅读工具中就产生偏差了. …
阅读工具自带的格式基本失效了
最最难受的就是阅读工具的宽度不及发布时"一行"的宽度…那就是灾难…
所以有什么方法解决这种情况吗

TXT中显示的样式
20230518155746

模拟宽度不够的灾难情况

试试电子书转换工具吧:

我觉得这种应该能处理。

vsc
替换\n\n为\n

刚试了下不行
它的介绍里也没提到类似的功能呀
可能相关的是 段落 之类的

一般区分段落的方法就是换行.
但是由于现在多出了意外换行…

现在的难题恰恰是 文本到段落 这部分

有没有从源头解决问题的,比如找一个格式靠谱的网站重新抓 txt

单独针对这段文本有很多种处理方式…
我贴的这段文本其实还算比较有规则的了
它段落间隔了一个单独的空白行
按照这种规则分隔然后单纯替换换行再合并就行了…

但是很可能没有这种单独的空白行
所以需要的是一种较通用的方法…
或者看看有没有类似的工具

感觉可能提供一个文件作为范例比较好解决……
单纯描述肯定无法给出确切解决方案

作者就是这样发布在网上的呀…

不是那起点那种大网站…有很多笔趣阁之类的源…

来 url 看看

为表述方便,本文作如下约定:

  • \n 代表换行符
  • \t 代表制表符
  • \s 代表半角空格

感觉您给的文本有两个特点:

  • \n\n 代表分段。
  • 每一自然段前有一段缩进,不知道是制表符(\t )、空格(\s)还是全角空格。

基于上述发现,我们可以设计两种替换方法。

方法1

  1. 将文中的 \n\n 替换为一段文章中未出现过的字符串,比如 【这是分段符】
  2. 将文章中所有的 \n 删除
  3. 将 (1) 中提到的分段符号(如 【这是分段符】)替换为 \n

方法2

这里假设每一段首句的缩进为两个空格,即 \s\s

  1. 将文章中所有的 \n 删除
  2. 将文章中所有 \s\s 替换文 \n\s\s

找到了,阅读有介绍过下载方法记得,你可以鼓捣鼓捣看看
我自己用阅读看小说的时候从来没遇到过段落问题,只遇到过防盗导致的密码……

不是那么正规的网站…
一时让我找个正规的例子出来还真有点难…
我找找看

:joy:

没事,你把链接引用一下,我觉得没啥问题:

url

sis和那个001的原创区基本上都是这种的…

其实我自己也折腾这种,这种单独的规则也写了一些
但效果都不大好
其实还是期待可能有我没发现的专精这方面的工具吧…

但好像连觉得这个是问题的人都比较少= =

这种每行字数固定的我好像就是直接先\n(.{,n-3})清理段尾句,再^(.{n-1,n+1})\n 删换行符,然后多加倍几次……剩下的就边读边校,毕竟你永远不知道站点加了什么奇怪广告……

3 Likes

正则替换就行了吧,每行固定字数的按楼上的方法替换就好。
也可以用先行断言把"前面非换行或者句号或者感叹号或者问号位置"的换行删除掉

3 Likes

图1这种段内回车,可以用cnbook这个文本处理器,这个是针对佛文排版开发的

所以对中文处理有奇效
无权操作 - 1

最新版叫textpro 6.5.1,已经停止开发了

图2的灾难性效果应该是没什么能处理好的了

还有个emeditor的脚本

        //段落重排(删错误回车,重新分段,首位必须有双空格)
        document.selection.Replace("^\\n\\n", "【临时标记】", nFlags);
        document.selection.Replace("([^  ]+)\\n([^  ]+)", "\\1\\2", nFlags);
        document.selection.Replace("([^  ]+)\\n([^  ]+)", "\\1\\2", nFlags);
        document.selection.Replace("([^  ]+)\\n([^  ]+)", "\\1\\2", nFlags);
        document.selection.Replace("([^  ]+)\\n([^  ]+)", "\\1\\2", nFlags);
        document.selection.Replace("([^  ]+)\\n([^  ]+)", "\\1\\2", nFlags);
        document.selection.Replace("([^  ]+)\\n([^  ]+)", "\\1\\2", nFlags);
        document.selection.Replace("([^  ]+)\\n([^  ]+)", "\\1\\2", nFlags);
        document.selection.Replace("([^  ]+)[  ]+", "\\1\\n  ", nFlags);
        document.selection.Replace("【临时标记】", "\\n\\n\\n", nFlags);
        break;

这个脚本的效果没textpro 6.5.1的效果好

所以我每台电脑都有个textpro备份

4 Likes

楼主其实想找成熟专业的工具,我估计大概应该是没有的
其实就是很多小网站提供的不专业的 TXT 分享格式,现在好像比较少了.
刚去 SIS TXT 区试了几下,好像大家都专业起来了

可以提供一点思路

  1. 像楼主给出的例子,真正的分段换行都是用的双换行符,用正则匹配单独的换行符删掉就好.
    vim 中可以这样替换
    \(\n\)\@<!\n\(\n\)\@!
    
  2. 如果没有双换行符,可以利用首行缩进,先删除所有换行符,再给缩进前面添加换行符
    %s/\n//g
    %s/  /\n\n  /g
    
  3. 如果碰到没有首行缩进,又没有双换行符的硬茬.先确定固定宽度 n,将 ^.{n} 后的换行符删掉就好了.
    可能误伤到真正的换行符,不过面对恐怖如斯的字墙,估计原作者亲至都不记得哪里有分段了
    %s/\(^.\{n}\)\@<=\n//g
    

其它特殊情况再见招拆招了

2 Likes

cnbook 删除段内回车挺好的…
在有空白行和无空白行的情况下都工作的挺好