String.replaceAll() 和 \n 换行符

String.replaceAll() and \n line breaks

我试着用一个小例子来解释我的问题。 我实现了版本 1 和版本 2,但没有得到想要的结果。我必须使用哪个替换参数才能通过 replaceAll 方法获得所需的结果?

版本 1:

String s = "TEST";
s = s.replaceAll("TEST", "TEST\nTEST");
System.out.println(s);

输出:

TEST

TEST



版本 2:

String s = "TEST";
s = s.replaceAll("TEST", "TEST\nTEST");
System.out.println(s);

输出:

TESTnTEST



期望的输出:

TEST\nTEST

来自javadoc of String#replaceAll(String, String)

Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use Matcher.quoteReplacement(java.lang.String) to suppress the special meaning of these characters, if desired.

s = s.replaceAll("TEST", Matcher.quoteReplacement("TEST\nTEST"));

您仍然需要 2 个反斜杠,因为 \ 是字符串文字的元字符。


你也可以使用不带 Matcher.quoteReplacement 的 4 个反斜杠:

  • 你想要一个 \ 在输出中
  • 你需要用 \ 转义它,因为 \ 是替换字符串的元字符:\
  • 您需要使用 \ 对两者进行转义,因为 \ 是字符串文字的元字符:\\
s = s.replaceAll("TEST", "TEST\\nTEST");

不要使用 replaceAll()

replaceAll() 执行 regex 搜索和替换,但您的任务不需要正则表达式 - 只需使用纯文本版本 replace()also 替换 all 次出现。

您需要一个文字反斜杠,它在 Java 字符串文字中编码为两个反斜杠:

String s = "TEST";
s = s.replace("TEST", "TEST\nTEST");
System.out.println(s);

输出:

TEST\nTEST