首页 > 解决方案 > 当值在变量中时,Java使用replaceAll替换大括号字符串,java 8

问题描述

我有一个变量:

String content = "<xxx.xx.name>xxx.xxx.com:111</xxx.xx.name>";
String destination = "\\$\\{VAR\\}";
String source = "xxx.xxx.com:111";
content = content.replaceAll(source, destination);

结果:

result = {IllegalArgumentException@781} Method threw 'java.lang.IllegalArgumentException' exception.
detailMessage = "Illegal group reference"
cause = {IllegalArgumentException@781} "java.lang.IllegalArgumentException: Illegal group reference"
stackTrace = {StackTraceElement[5]@783} 
suppressedExceptions = {Collections$UnmodifiableRandomAccessList@773}  size = 0

但如果我这样做:

content = content.replaceAll(source,"\\$\\{VAR\\}");

一切正常。如何模仿或修复 replaceAll?

标签: javastringjava-8str-replacereplaceall

解决方案


从以下文档String.replaceAll(String, String)

请注意,替换字符串中的反斜杠 (\) 和美元符号 ($)可能会导致结果与将其视为文字替换字符串时的结果不同;

强调可能,取决于您的 Java 版本,这可能会失败(尽管我无法重现 Java 8、11、12、15甚至早期访问Java 16的问题)

您可以使用Matcher.quoteReplacement(String)转义替换字符串中的 \ 和 $ 字符,如 javadoc 后面所述:

如果需要,使用 Matcher.quoteReplacement(java.lang.String) 来抑制这些字符的特殊含义。

所以把你的代码改成这个(假设你想用${VAR}而不是用替换内容\${VAR\}):

String content = "<xxx.xx.name>xxx.xxx.com:111</xxx.xx.name>";
String destination = Matcher.quoteReplacement("${VAR}");
String source = "xxx.xxx.com:111";
content = content.replaceAll(source, destination);

结果是:

<xxx.xx.name>${VAR}</xxx.xx.name>

演示


推荐阅读