我正在尝试下面的代码,但得到错误
String x = "aaa XXX bbb";
String replace = "XXX";
String y = "xy$z";
String z=y.replaceAll("$", "\\$");
x = x.replaceFirst(replace, z);
System.out.println(x);
错误
Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Unknown Source)
at java.util.regex.Matcher.replaceFirst(Unknown Source)
at java.lang.String.replaceFirst(Unknown Source)
at Test.main(Test.java:10)
我希望结果为
aaa xy$z bbb
使用replace()
代替,它不使用正则表达式,因为你根本不需要它们:
String x = "aaa XXX bbb";
String replace = "XXX";
String y = "xy$z";
x = x.replace(replace, y);
System.out.println(x);
这将按预期打印aaa xy$z bbb
。
如果替换字符串包含美元符号或反斜杠字符,则应使用
Matcher.quoteReplacement()
所以改变
String z=y.replaceAll("$", "\\$");`
至
String z = Matcher.quoteReplacement(y);
错误的原因是在行之后:
String z=y.replaceAll("$", "\\$");
z
的价值是:xy$z$
你真正想做的是:
String x = "aaa XXX bbb";
String replace = "XXX";
String y = "xy\\$z";
x = x.replaceFirst(replace, y);
System.out.println(x);
这将输出:
aaa xy$z bbb
问题是由于qazxsw poi qazxsw poi的价值是qazxsw poi
将给定替换的给定正则表达式匹配的此字符串的第一个子字符串替换。调用replaceFirst形式的此方法会产生与表达式完全相同的结果
String z=y.replaceAll("$", "\\$");
请注意,替换字符串中的反斜杠(xy$z$
)和美元符号(str.replaceFirst(regex, repl)
)可能会导致结果与将其视为文字替换字符串时的结果不同;