文本清理和替换:从Java中的文本中删除\ n

时间:2009-02-12 16:48:51

标签: java string

我正在清理Java代码中的传入文本。该文本包含很多“\ n”,但不是在新行中,而是字面上的“\ n”。我正在使用String类中的replaceAll(),但是无法删除“\ n”。 这似乎不起作用:

String string;
string = string.replaceAll("\\n", "");

这两个都没有:

String string;
string = string.replaceAll("\n", "");

我猜最后一个被识别为实际的新行,因此文本中的所有新行都将被删除。

此外,从String中删除不同模式的错误文本的有效方法是什么。我正在使用正则表达式来检测它们,像HTML保留字符等等和replaceAll,但每次我使用replaceAll时,整个字符串都被读取,对吧?

更新:感谢您的回答。我在这里提出了这个问题:
Text replacement efficiency
我特别询问效率:D

9 个答案:

答案 0 :(得分:43)

Hooknc是对的。我想发一点解释:

编译完成后,<\ n>“\ n”转换为“\ n”(因为你转义反斜杠)。因此,正则表达式引擎看到“\ n”并认为新行,并将删除那些(而不是文字“\ n”)。

“\ n”由编译器转换为一个真正的新行。所以新的行字符被发送到正则表达式引擎。

<\ n>“\\\\ n”很难看,但是对。编译器删除转义序列,因此正则表达式引擎看到“\\ n”。正则表达式引擎看到两个反斜杠,并知道第一个反斜杠转义它,以便转换为检查文字字符'\'和'n',为您提供所需的结果。

Java很好(这是我工作的语言)但是必须考虑基本上双重逃避正则表达式可能是一个真正的挑战。为了获得额外的乐趣,StackOverflow似乎也喜欢尝试翻译反斜杠。

答案 1 :(得分:22)

我认为你需要添加更多的slashies ......

String string;
string = string.replaceAll("\\\\n", "");

说明: slashies的数量与“\ n”本身是Java中的受控字符这一事实有关。

所以要在某个地方获得“\ n”的真实字符,我们需要使用“\ n”。如果打印出来,请给我们:“\”

您正在寻找替换文件中的所有“\ n”。但是你不打算更换控件“\ n”。所以你试过“\ n”,它将被转换成字符“\ n”。很棒,但也许不是那么多。我的猜测是,replaceAll方法实际上会使用“\ n”字符创建一个正则表达式,这些字符将被误读为控制字符“\ n”。

哇,差不多完成了。

使用replaceAll(“\\ n”,“”)将首先转换“\\ n” - &gt; “\ n”将由正则表达式使用。然后将在正则表达式中使用“\ n”,并实际表示“\ n”的文本。这是您要替换的内容。

答案 2 :(得分:11)

使用正则表达式而不是String.replaceAll(),最好使用String.replace(),它可以进行简单的字符串替换(如果你使用的是至少Java 1.5)。

String replacement = string.replace("\\n", "");

应该做你想做的事。

答案 3 :(得分:3)

string = string.replaceAll(""+(char)10, " ");

答案 4 :(得分:2)

试试这个。希望能帮助到你。

raw = raw.replaceAll("\t", "");
raw = raw.replaceAll("\n", "");
raw = raw.replaceAll("\r", "");

答案 5 :(得分:1)

其他答案已经充分涵盖了如何使用replaceAll执行此操作,以及如何根据需要转义反斜杠。

从1.5。开始,还有String.replace(CharSequence, CharSequence)执行文字字符串替换。这可以大大简化字符串替换的许多问题,因为不需要转义任何正则表达式元字符,如.*|和是,\本身。

因此,给定一个可以包含子串"\n"(不是'\n')的字符串,我们可以按如下方式删除它们:

String before = "Hi!\\n How are you?\\n I'm \n   good!";
System.out.println(before);
// Hi!\n How are you?\n I'm 
//   good!

String after = before.replace("\\n", "");

System.out.println(after);
// Hi! How are you? I'm 
//   good!

请注意,如果您坚持使用replaceAll,则可以使用Pattern.quote来防止丑陋:

System.out.println(
    before.replaceAll(Pattern.quote("\\n"), "")
);
// Hi! How are you? I'm 
//   good!

当你给出一个必须按字面意思匹配的任意字符串而不是正则表达式模式时,你也应该使用Pattern.quote

答案 6 :(得分:1)

我用这个解决方案来解决这个问题:

String replacement = str.replaceAll("[\n\r]", "");

答案 7 :(得分:0)

通常\ n工作正常。否则,您可以选择多个replaceAll语句。 首先在文本上应用一个replaceAll,然后在文本上再次重新应用replaceAll。应该做你想要的。

答案 8 :(得分:-2)

我相信replaceAll()是一项昂贵的操作。以下解决方案可能会表现得更好:

String temp = "Hi \n Wssup??";          
System.out.println(temp);

StringBuilder result = new StringBuilder();

StringTokenizer t = new StringTokenizer(temp, "\n");

while (t.hasMoreTokens()) {
    result.append(t.nextToken().trim()).append("");
}
String result_of_temp = result.toString();

System.out.println(result_of_temp);