如何从Java中删除文件中的换行符?

tre*_*ker 247 java string newline line-breaks

如何在Java中替换字符串中的所有换行符,以便在Windows和Linux上工作(即没有特定于OS的回车/换行/换行等问题)?

我试过了(注意readFileAsString是一个将文本文件读入String的函数):

String text = readFileAsString("textfile.txt");
text.replace("\n", "");
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.

如何才能做到这一点?

Kal*_*see 408

您需要设置text结果text.replace():

String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为字符串是不可变的 - 调用replace不会更改原始字符串,它会返回一个已更改的新字符串.如果未将结果分配给text,那么新的String将丢失并收集垃圾.

至于获取任何环境的换行符 - 可通过调用获得System.getProperty("line.separator").

  • 也许`text = text.replace("\ r \n","").replace("\n","");`是一个更好的解决方案:否则单词会相互"粘合"(没有单个) - 空间替换). (72认同)
  • 您还可以使用方括号来正确匹配任何操作系统的换行符:`.replaceAll("[\\ r \\n] +","")` (7认同)
  • @basZero `replaceAll` 接受正则表达式,`replace` 接受文字字符串,两者都替换所有出现。 (4认同)
  • 由于问题是要求替换所有出现的,因此解决方案是`text = text.replaceAll("\n", "").replaceAll("\r", "");` (2认同)

Ste*_*n C 208

如其他答案所述,您的代码主要String.replace(...)不起作用,因为不会更改目标字符串.(它不能 - Java字符串是不可变的!)它实际上做的是创建一个新的String,其中的字符根据需要进行了更改.但是你的代码然后扔掉那个String ...


这是一些可能的解决方案.哪一个最正确取决于你究竟想做什么.

// #1
text = text.replace("\n", "");
Run Code Online (Sandbox Code Playgroud)

只需删除所有换行符.这不适用于Windows或Mac线路终端.

// #2
text = text.replace(System.getProperty("line.separator"), "");
Run Code Online (Sandbox Code Playgroud)

删除当前平台的所有行终止符.这不适用于您尝试在Windows上处理(例如)UNIX文件的情况,反之亦然.

// #3
text = text.replaceAll("\\r|\\n", "");
Run Code Online (Sandbox Code Playgroud)

删除所有Windows,UNIX或Mac行终止符.但是,如果输入文件是文本,这将连接单词; 例如

Goodbye cruel
world.
Run Code Online (Sandbox Code Playgroud)

Goodbye cruelworld.
Run Code Online (Sandbox Code Playgroud)

所以你可能真的想这样做:

// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");
Run Code Online (Sandbox Code Playgroud)

用空格替换每个行终止符.

  • 这是一个很好的答案。感谢 Java 8 示例。感谢您的帮助! (3认同)

Fab*_*eeg 21

如果只想删除当前操作系统上有效的行终止符,可以执行以下操作:

text = text.replaceAll(System.getProperty("line.separator"), "");
Run Code Online (Sandbox Code Playgroud)

如果要确保删除任何行分隔符,可以这样做:

text = text.replaceAll("\\r|\\n", "");
Run Code Online (Sandbox Code Playgroud)

或者,稍微冗长,但更少的regexy:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");
Run Code Online (Sandbox Code Playgroud)

  • 为了避免将单词粘在一起(如对Kaleb的回答所述),可以将正则表达式方法修改为`text.replaceAll("(\\ r | \\n)+","")`和(假设贪婪是默认的Java?)你将有一个解决方案,每个新的行字符序列只有*一个*空格. (2认同)

小智 14

此函数将所有空格(包括换行符)向下归一化为单个空格.不完全是原始问题所要求的,但很可能在许多情况下完全需要:

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
Run Code Online (Sandbox Code Playgroud)


JSB*_*ach 11

我想这会很有效率

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
Run Code Online (Sandbox Code Playgroud)

编辑语法高亮


小智 10

str = str.replaceAll("\\r\\n|\\r|\\n", " ");
Run Code Online (Sandbox Code Playgroud)

经过大量的搜索后,我找到了很好的工作,但是每一行都失败了.


Aif*_*Aif 6

在windows/linux/mac下,换行符不一样.您应该将System.getProperties与属性line.separator一起使用.


Wal*_*rer 5

在 Kotlin 中,以及从 Java 11 开始,Stringlines()一个方法,它返回多行字符串中的行列表。您可以获取所有行,然后将它们合并成一个字符串。

使用 Kotlin 就变得很简单

str.lines().joinToString("")
Run Code Online (Sandbox Code Playgroud)