ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

但这似乎不起作用。

如何才能做到这一点?

你想消除所有的换行符吗?或者您想将它们统一为标准解决方案?
哦,如果要删除所有换行符,请删除所有 \n 和所有 \r(因为 Windows 换行符是 \r\n)。
嘿,仅供参考,如果您想用单个换行符替换同时的多换行符,那么您可以使用 myString.trim().replaceAll("[\n]{2,}", "\n") 或用单个空格替换 myString.trim().replaceAll("[\n]{2,}", " ")

C
Community

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

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

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

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


+1,正确。至于原因:字符串是不可变的replace() 方法返回所需的结果。另请参阅 API 文档:java.sun.com/javase/6/docs/api/java/lang/… 编辑: 啊,你已经在之后自己编辑了 :)
也许 text = text.replace("\r\n", " ").replace("\n", " "); 是一个更好的解决方案:否则单词将彼此“粘合”(没有单个空格替换)。
您还可以使用方括号为任何操作系统正确匹配换行符:.replaceAll("[\\r\\n]+", "")
由于问题是要求替换所有事件,因此解决方案是text = text.replaceAll("\n", "").replaceAll("\r", "");
@basZero replaceAll 接受正则表达式,replace 接受文字字符串,都替换所有出现。
S
Stephen C

如其他答案所述,您的代码主要无法正常工作,因为 String.replace(...) 不会更改目标 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) 行终止符,因此我们需要注意不要将其替换为两个空格。


这是一个很好的答案。感谢 Java 8 示例。感谢您的帮助!
谢谢这对我有用......顺便说一句,你能解释一下 text = text.replaceAll("\\r\\n|\\r|\\n", " ");
选项 4: A \r 通常不会是单独的。如果有\r,则有\n。
@Parthan_akon 这是一个正则表达式。 |意味着或。它将替换匹配的第一个块。所以如果有\r\n,就会被替换为一个空格。如果有 \r 但没有 \n 或相反,它也将是一个空格。他这样做是为了防止将 \r 和 \n 替换为空格并以 2 个空格结尾。
@Veda - 在 MacOS 9 之前,没有 \n\r 是行分隔符;见en.wikipedia.org/wiki/Newline。在其他旧系统上。
R
Richard Slater

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

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);

M
Marek J

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

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

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

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

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

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

为了避免将单词粘合在一起(如对 Kaleb 答案的评论中所讨论的),可以将正则表达式方法修改为 text.replaceAll("(\\r|\\n)+", " ") 并且(假设贪婪在 Java 中是默认的?)您将有一个只有 one 空间的解决方案对于每个新行字符序列。
S
Stephen C

我猜这会很有效

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")

确保您拥有完全相同的代码,而不是在粘贴时丢失“\n”字符。因为它应该工作。也许是因为我忘记了最后一个分号(;)。
R
Renán D
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

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


我试图单独做,不知道为什么它不起作用,这个就像魅力一样。
A
Aif

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


M
Mr-IDE
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

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

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

简而言之,String text = readFileAsString("textfile.txt").trim(); 也适用于您。 (使用 Java 6 检查)


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

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


T
Thomas Pornin

您可能希望使用 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() 在返回的字符串中不包括行终止符。上面的代码附加了一个空格,以避免将一行的最后一个单词和下一行的第一个单词粘合在一起。


A
AbstractVoid

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

使用 Kotlin,它将像

str.lines().joinToString("")

这对于所要求的内容根本没有用。
问题指出:“替换字符串中的所有换行符”——而解决方案正是以一种简单、干净和可靠的方式做到了这一点。
大约 12 年前,他们问过关于 Java 的问题——你对 Kotlin 的回答没有任何用处
我的回答包含有关 Java 方法的信息:...since Java 11, String has lines() method...。 Kotlin 示例是一个奖励。
s
svarog

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

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

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

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

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

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

StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
S
Sourav Chandra

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

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

或替换为单个空格

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

h
hveiga

您可以使用 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);

R
Rakesh Chaudhari

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

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++;
    }

}

K
Kumar Abhishek

org.apache.commons.lang.StringUtils#chopNewline


-1 因为 Deprecated 并且仅在字符串末尾删除。
O
Ofir Farchy

尝试这样做:

 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", "");

如果您替换 \n,则不再有 \r\n 如果您替换 \n 并且有一个 \\n 它将被替换,因此只有 \ 将保留。