285

如何以适用于 Windows 和 Linux 的方式替换 Java 中字符串中的所有换行符(即没有操作系统特定的回车/换行/换行等问题)?

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

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

但这似乎不起作用。

如何才能做到这一点?

4

17 回答 17

483

您需要设置texttext.replace()

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

这是必要的,因为字符串是不可变replace的——调用不会更改原始字符串,它会返回一个已更改的新字符串。如果您不将结果分配给text,则该新字符串将丢失并被垃圾收集。

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

于 2010-01-29T15:47:18.237 回答
250

如其他答案所述,您的代码无法正常工作主要是因为String.replace(...)没有更改 target String。(它不能——Java 字符串是不可变的!)replace实际上所做的是创建并返回一个新String对象,其中的字符根据需要进行了更改。但是你的代码然后扔掉了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", " ");

它将每个行终止符替换为空格1。从 Java 8 开始,您还可以这样做:

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

如果你想用一个空格替换多行终止符:

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

1 - 注意#3 和#4 之间存在细微差别。该序列\r\n表示单个(Windows)行终止符,因此我们需要注意不要将其替换为两个空格。

于 2010-01-29T16:07:52.030 回答
33

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

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
于 2017-04-28T22:38:32.437 回答
25

如果您只想删除在当前操作系统上有效的行终止符,您可以这样做:

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

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

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

或者,稍微冗长一些,但不那么正则表达式:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");
于 2010-01-29T15:52:20.517 回答
14

我猜这会很有效

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
于 2013-03-09T17:16:02.320 回答
13
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

在搜索了很多之后对我来说非常适合,其他所有线路都失败了。

于 2014-07-25T16:38:57.450 回答
6

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

于 2010-01-29T15:49:43.573 回答
4
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

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

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

总之 String text = readFileAsString("textfile.txt").trim();也适合你。(使用 Java 6 检查)

于 2012-08-31T04:27:34.647 回答
3

您可能希望使用BufferedReader. 此类可以将输入分解为单独的行,您可以随意组合这些行。无论当前平台如何,操作方式BufferedReader都会自动识别 Linux、Windows 和 MacOS 世界的行尾约定。

因此:

BufferedReader br = new BufferedReader(
    new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;) {
    String line = br.readLine();
    if (line == null)
        break;
    sb.append(line);
    sb.append(' ');   // SEE BELOW
}
String text = sb.toString();

请注意,readLine()返回的字符串中不包含行终止符。上面的代码附加了一个空格,以避免将一行的最后一个单词和下一行的第一个单词粘合在一起。

于 2010-01-29T16:57:26.780 回答
3
String text = readFileAsString("textfile.txt").replace("\n","");

.replace 返回一个新字符串,Java 中的字符串是不可变的。

于 2010-01-29T15:49:26.447 回答
1

我觉得奇怪的是(Apache)StringUtils还没有在这里介绍。

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

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

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

因为换行符在技术上是一个字符,所以您可以选择使用.replaceChars替换字符的方法

StringUtils.replaceChars(myString, '\n', '');
于 2016-07-02T13:45:12.250 回答
1

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

使用 Kotlin,它将像

str.lines().joinToString("")
于 2021-06-29T18:18:47.697 回答
0

您可以使用通用方法将任何字符替换为任何字符。

public static void removeWithAnyChar(String str, char replceChar,
        char replaceWith) {
    char chrs[] = str.toCharArray();
    int i = 0;
    while (i < chrs.length) {

        if (chrs[i] == replceChar) {
            chrs[i] = replaceWith;
        }
        i++;
    }

}
于 2017-03-31T05:00:16.767 回答
0

仅供参考,如果您想用单换行符替换同时的多换行符,那么您可以使用

myString.trim().replaceAll("[\n]{2,}", "\n")

或替换为单个空格

myString.trim().replaceAll("[\n]{2,}", " ")
于 2016-09-19T13:44:04.313 回答
0

您可以使用 apache commons 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);
于 2016-01-21T21:22:21.020 回答
-1

org.apache.commons.lang.StringUtils#chopNewline

于 2018-05-22T05:42:55.147 回答
-2

尝试这样做:

 textValue= textValue.replaceAll("\n", "");
 textValue= textValue.replaceAll("\t", "");
 textValue= textValue.replaceAll("\\n", "");
 textValue= textValue.replaceAll("\\t", "");
 textValue= textValue.replaceAll("\r", "");
 textValue= textValue.replaceAll("\\r", "");
 textValue= textValue.replaceAll("\r\n", "");
 textValue= textValue.replaceAll("\\r\\n", "");
于 2012-11-09T10:18:05.970 回答