java - 当值在变量中时,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?
解决方案
从以下文档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>
演示
推荐阅读
- r - 在 R 中寻找内核平滑回归的最佳带宽
- tensorflow - 如何优化 TensorFlow Lite 以将计算图从静态变为动态?
- kotlin - 声明为“val”的变量如何在 Kotlin 的 for 循环中工作?
- python - 如何连接到 Storj 个人资料?
- reactjs - 在 React.js 中单击外部时如何隐藏图层?
- python - 如何在 DynamoDB 中查询 begin_with 的主键?
- hardware - 如何从辅助端口读取原始位?
- python - 在创建新的 Conda 虚拟环境后,Tensorflow 的训练速度非常慢
- laravel - 如何创建自定义页面并将其显示在 Laravel Nova 的菜单中?
- mpandroidchart - MPAndroidChart groupBars()“每组间隔”计算公式