我尝试用一个小例子来解释我的问题。 我实现了版本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
答案 0 :(得分:6)
来自javadoc of String#replaceAll(String, String)
:
请注意替换中的反斜杠(
\
)和美元符号($
) 字符串可能会导致结果与正确的结果不同 被视为字面替换字符串;见Matcher.replaceAll
。使用Matcher.quoteReplacement(java.lang.String)
压制特殊 如果需要,这些字符的含义。
s = s.replaceAll("TEST", Matcher.quoteReplacement("TEST\\nTEST"));
你仍然需要2个反斜杠,因为\
是字符串文字的元数据。
您还可以使用不带Matcher.quoteReplacement
的4个反斜杠:
\
\
转义它,因为\
是替换字符串的元数据:\\
\
进行转义,因为\
是字符串文字的元数据:\\\\
s = s.replaceAll("TEST", "TEST\\\\nTEST");
答案 1 :(得分:3)
请勿使用replaceAll()
!
replaceAll()
执行 regex 搜索和替换,但您的任务不需要正则表达式 - 只需使用纯文本版本replace()
,也替换所有次出现。
您需要一个文字反斜杠,它在Java字符串文字中被编码为两个反斜杠:
String s = "TEST";
s = s.replace("TEST", "TEST\\nTEST");
System.out.println(s);
输出:
TEST\nTEST