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


258

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

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

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

但这似乎不起作用。

如何才能做到这一点?


是否要消除所有换行符?还是要将它们统一为标准解决方案?
helios 2010年

4
哦,如果要删除所有换行符,请同时删除所有\ n和所有\ r(因为Windows换行符为\ r \ n)。
helios 2010年

嘿,仅供参考,如果您想用单个换行符替换同时的多行换行符,那么您可以使用 myString.trim().replaceAll("[\n]{2,}", "\n") 或用单个空格替换 myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra

Answers:


435

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

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

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

至于在任何环境下获取换行字符串,均可通过调用获得System.getProperty("line.separator")


1
+1,正确。至于原因:String是不可变的。该replace()方法返回所需的结果。另请参阅API文档:java.sun.com/javase/6/docs/api/java/lang/… 编辑:啊,您已经在之后编辑了自己:)
BalusC 2010年

75
也许text = text.replace("\r\n", " ").replace("\n", " ");是一个更好的解决方案:否则,单词将彼此“粘合”在一起(无需单空格替换)。
巴特·基尔斯

9
您也可以使用方括号在任何操作系统上正确地匹配换行符:.replaceAll("[\\r\\n]+", "")
Yeti

2
由于问题是要替换所有出现的问题,因此解决方案是text = text.replaceAll("\n", "").replaceAll("\r", "");
basZero

2
@basZero replaceAll接受正则表达式,replace接受文字字符串,都替换所有出现的内容。
乔纳斯·瓦利

220

如其他答案所述,您的代码无法正常运行主要是因为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", " ");

用空格替换每个行终止符。从Java 8开始,您还可以执行以下操作:

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

如果要用一个空格替换多个行分隔符:

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

这是一个很好的答案。Java 8示例的荣誉。感谢您的帮助!
HankNessip

22

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

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

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

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

或者,稍微冗长一些,但后缀少一些:

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

2
为了避免将单词粘在一起(如对Kaleb答案的评论中所讨论的),可以将regex方法修改为text.replaceAll("(\\r|\\n)+", " ")和(假设greedy在Java中是默认设置?),您将有一个解决方案,其中每个换行符序列只有一个空格。
约恩·舒德罗德(JørnSchou-Rode)2010年

18

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

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);

14

我想这会很有效

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

确保您具有完全相同的代码,而不是在粘贴时丢失“ \ n”字符。因为它应该工作。也许是因为我忘记了最后一个分号(;)。
JSBach

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

经过大量搜索之后,我的工作非常完美,但每行都失败了。




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


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

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

该文档省略了说还将删除新的行字符(前导和尾随)。

总之 String text = readFileAsString("textfile.txt").trim();也将为您工作。(已通过Java 6进行了检查)


1

我很奇怪(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});
卢卡斯·克劳福德

0

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

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

或用单个空格替换

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

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

0

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

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

}


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

5
如果更换\n不存在\r\n了,如果你替换\ n和存在\\ñ它会被替换所以只有\将保持不变。
罗布2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.