我如何替换所有的换行符从一个字符串在Java在这样的方式,将工作在Windows和Linux(即没有具体的操作系统的回车/换行/新行等问题)?

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

String text = readFileAsString("textfile.txt");
text.replace("\n", "");

但这似乎并不奏效。

如何做到这一点呢?


当前回答

String text = readFileAsString("textfile.txt").replaceAll("\n", "");

尽管在oracle网站中trim()的定义是 返回字符串的副本,省略前导和尾随空格。

文档没有说明新的行字符(前导和后尾)也将被删除。

简而言之 字符串文本= readFileAsString("textfile.txt").trim();对你也有用。 (用java6核对)

其他回答

我发现奇怪的是(Apache) StringUtils还没有在这里被覆盖。

您可以使用.replace方法从字符串中删除所有换行符(或任何其他出现的子字符串)

StringUtils.replace(myString, "\n", "");

这一行将用空字符串替换所有换行符。

因为换行符在技术上是一个字符,你可以选择使用. replacecars方法来替换字符

StringUtils.replaceChars(myString, '\n', '');

换行符在windows/linux/mac下是不一样的。你应该使用系统。使用属性line.separator获取properties。

如果你只想删除当前操作系统上有效的行结束符,你可以这样做:

text = text.replaceAll(System.getProperty("line.separator"), "");

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

text = text.replaceAll("\\r|\\n", "");

或者,稍微啰嗦一点,但不那么regexy:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");

您可以使用apache公共IOUtils遍历该行并将每行附加到StringBuilder。不要忘记关闭InputStream

StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
{
  sb.append(lt.nextLine());
}
String text = sb.toString();
IOUtils.closeQuitely(fin);

正如在其他回答中提到的,您的代码无法工作,主要是因为String.replace(…)没有更改目标String。(不能——Java字符串是不可变的!)replace实际上所做的是创建并返回一个新的String对象,其中字符根据需要进行了更改。但是你的代码会丢弃这个字符串…


这里有一些可能的解决方案。哪一个是最正确的取决于你到底想要做什么。

// #1
text = text.replace("\n", "");

简单地删除所有换行符。这并不适用于Windows或Mac行终止。

// #2
text = text.replace(System.getProperty("line.separator"), "");

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

// #3
text = text.replaceAll("\\r|\\n", "");

删除所有Windows、UNIX或Mac行结束符。然而,如果输入文件是文本,这将连接单词;如。

Goodbye cruel
world.

就变成了

Goodbye cruelworld.

你可能会想这样做:

// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");

它将每个行结束符替换为space1。从Java 8开始,你也可以这样做:

// #5
text = text.replaceAll("\\R", " ");

如果你想用一个空格替换多个行结束符:

// #6
text = text.replaceAll("\\R+", " ");

1 -注意,第3条和第4条之间有细微的区别。序列\r\n表示单个(Windows)行结束符,因此我们需要注意不要将其替换为两个空格。