Java换行符替换

7
我想知道为什么我使用这个代码没有得到预期的结果:
String t = "1302248663033   <script language='javascript'>nvieor\ngnroeignrieogi</script>";
t.replaceAll("\n", "");
System.out.println(t);

输出结果为:
1302248663033   <script language='javascript'>nvieor
gnroeignrieogi</script>

我想知道为什么 \n 还在那里。有人知道吗?\n 有特殊的作用吗?

编辑:

我在正则表达式中使用 . 匹配换行符时遇到了问题,没有意识到以前需要使用 DOTALL 选项,所以我会在这里添加未来参考所需的内容:

String text = null;
text = FileUtils.readFileToString(inFile);
Pattern p = Pattern.compile("<script language='javascript'>.+?</script>\n", Pattern.DOTALL);
text = p.matcher(text).replaceAll("");
out.write(text);
3个回答

21

字符串是不可变的。像 replaceAll 这样的字符串操作不会修改调用它的实例,而是返回新的字符串实例。解决方法是将修改后的字符串赋值给原始变量。

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

4
为了在不同操作系统之间实现可移植性,请使用System.getProperty("line.separator")代替换行符。 - eee

1

是的,\n很特殊。它是代表换行符的转义序列。 你需要在字符串中使用反斜杠转义它,以便按照你希望的方式进行实际解释。在序列前面添加 \ 使其看起来像这样:

"\\n"

现在你的程序应该看起来像这样:

String t = "1302248663033   <script language='javascript'>nvieor\\ngnroeignrieogi</script>";
t = t.replaceAll("\\n", "");
System.out.println(t);

当然,如果字符串t来自于程序之外的某个地方,而不是由您键入到程序中,则只需在调用replaceAll()时添加额外的斜杠即可。

根据评论进行了编辑。


我错过了其他人指出的错误。你需要获取 replaceAll() 调用的结果并使用它,而不是原始字符串。 - chandsie

0
public static String escape(String s) {
    return s
            .replaceAll("\n", "")
            .replaceAll("\r", "");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接