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
相关产品推荐
相关产品推荐

