文本清理和替换:从Java中的文本中删除\ n
我正在清理Java代码中的传入文本。 该文本包含许多“\ n”,但不是在新行中,而是字面上的“\ n”。 我正在使用String类中的replaceAll(),但是无法删除“\ n”。 这似乎不起作用:
String string; string = string.replaceAll("\\n", "");
这也不是:
String string; string = string.replaceAll("\n", "");
我想最后一个被识别为一个实际的新行,因此文本中的所有新行都将被删除。
此外,从String中删除不同模式的错误文本的有效方法是什么。 我正在使用正则表达式来检测它们,像HTML保留字符等等和replaceAll,但每次我使用replaceAll时,整个字符串都被读取,对吧?
更新 :谢谢你的答案。 我在这里扩展了这个问题:
文字替换效率
我特别询问效率:D
Hooknc是对的。 我想发一点解释:
编译完成后,“\\ n”转换为“\ n”(因为你转义反斜杠)。 所以正则表达式引擎看到“\ n”并认为新行,并将删除那些(而不是你的文字“\ n”)。
“\ n”由编译器转换为一个真正的新行。 所以新行字符被发送到正则表达式引擎。
“\\\\ n”很难看,但是对。 编译器删除转义序列,因此正则表达式引擎看到“\\ n”。 正则表达式引擎看到两个反斜杠,并知道第一个反斜杠转义它,以便转换为检查文字字符’\’和’n’,为您提供所需的结果。
Java很好(这是我工作的语言),但不得不考虑基本上双重逃避正则表达式可能是一个真正的挑战。 为了获得额外的乐趣,StackOverflow似乎也喜欢尝试翻译反斜杠。
我想你需要添加几个slashies ……
String string; string = string.replaceAll("\\\\n", "");
说明:slashies的数量与“\ n”本身是Java中的受控字符这一事实有关。
因此,为了获得“\ n”的真实字符,我们需要使用“\ n”。 如果打印出来给我们:“\”
您正在寻找替换文件中的所有“\ n”。 但是你不打算更换控件“\ n”。 所以你试过“\ n”,它将被转换成字符“\ n”。 很棒,但也许不是那么多。 我的猜测是,replaceAll方法实际上会使用“\ n”字符创建一个正则表达式,这些字符将被误读为控制字符“\ n”。
哇,差不多完成了。
使用replaceAll(“\\ n”,“”)将首先转换将由正则表达式使用的“\\ n” – >“\ n”。 然后,“\ n”将在正则表达式中使用,并实际表示“\ n”的文本。 这是您要替换的内容。
使用正则表达式而不是String.replaceAll(),最好使用String.replace(),它执行简单的字符串替换(如果您至少使用Java 1.5)。
String replacement = string.replace("\\n", "");
应该做你想做的事。
string = string.replaceAll(""+(char)10, " ");
尝试这个。 希望能帮助到你。
raw = raw.replaceAll("\t", ""); raw = raw.replaceAll("\n", ""); raw = raw.replaceAll("\r", "");
其他答案已经充分涵盖了如何使用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
。
我用这个解决方案来解决这个问题:
String replacement = str.replaceAll("[\n\r]", "");
通常\ n工作正常。 否则,您可以选择多个replaceAll语句。 首先在文本上应用一个replaceAll,然后在文本上再次重新应用replaceAll。 应该做你想要的。
我相信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);