You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java处理文件字符串时如何删除单个换行符、保留连续双换行符

问题原因

你当前用的replaceAll("\\r\\n{1}", "")存在两个问题:

  • 正则\r\n{1}等价于\r\n,会匹配所有\r\n换行,不会区分单个换行还是连续换行,全部替换为空
  • 仅匹配了Windows风格的\r\n换行,如果文件里存在Unix风格的\n换行就会残留,导致字符列表里还有多余换行

解决方案

方案1:正则零宽断言实现

通过零宽断言匹配前后都没有其他换行的单个换行,直接替换为空格,代码如下:

String content = new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
// 匹配单个\r\n换行,替换为空格,保留连续两个\r\n
String testing = content.replaceAll("(?<!\r\n)\r\n(?!\r\n)", " ");

// 后续转字符列表逻辑不变
LinkedList<Character> alphabetList = testing.chars()
        .mapToObj(i -> (char)i)
        .collect(Collectors.toList());

方案2:占位符替换(兼容性更强,逻辑更直观)

如果担心正则断言的兼容性,或者需要同时兼容\r\n和\n两种换行格式,可以用占位符中转实现:

String content = new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
// 第一步:先把连续两个换行替换为临时占位符
String temp = content.replace("\r\n\r\n", "___DOUBLE_NEWLINE___");
// 第二步:把剩余的所有单个换行替换为空格
temp = temp.replace("\r\n", " ");
// 第三步:把占位符换回连续两个换行
String testing = temp.replace("___DOUBLE_NEWLINE___", "\r\n\r\n");

效果验证

针对你给出的示例原内容:

A
1


b
;
d

两种方案处理后都会得到如下结果,完全符合需求:

A 1


b ; d

内容的提问来源于stack exchange,提问作者Omegon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:54:04