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

2022-09-01 18:02:25

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

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

这也不会:

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

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

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

更新:感谢您的精彩回答。我在这里扩展了这个问题:
文本替换效率
,我专门问的是效率:D


答案 1

Hooknc是对的。我只想发布一些解释:

编译器完成后,“\\n”将转换为“\n”(因为您转义了反斜杠)。因此,正则表达式引擎看到“\n”并认为换行符,并删除它们(而不是您拥有的文字“\n”)。

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

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

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


答案 2

我认为你需要再添加几个斜杠...

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

说明: 斜杠的数量与以下事实有关:“\n”本身在 Java 中是一个受控字符。

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

您希望替换文件中的所有“\n”。但您不希望替换控件“\n”。因此,您尝试了“\n”,它将转换为字符“\n”。很好,但也许不是那么多。我的猜测是,replaceAll 方法实际上将使用“\n”字符创建一个正则表达式,该字符将被误读为控制字符“\n”。

呼,快完成了。

使用 replaceAll(“\\n”, “”) 将首先将 “\\n” ->正则表达式将使用的 “\n”。然后,“\n”将在正则表达式中使用,并且实际上表示“\n”的文本。这就是您要替换的。