4

我正在尝试下面的代码,但出现错误

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
4

4 回答 4

7

使用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正如预期的那样,这将打印出来。

于 2012-08-31T04:26:24.693 回答
3

如果替换字符串包含美元符号或反斜杠字符,则应使用

Matcher.quoteReplacement()

所以改变

String z=y.replaceAll("$", "\\$");` 

String z = Matcher.quoteReplacement(y);
于 2012-08-31T04:24:09.757 回答
1

错误的原因是在该行之后:

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
于 2012-08-31T04:21:30.947 回答
0

问题 id 由于replaceFirst 的值String z=y.replaceAll("$", "\\$");xy$z$

用给定的替换替换此字符串中与给定正则表达式匹配的第一个子字符串。调用这种形式的方法会str.replaceFirst(regex, repl)产生与表达式完全相同的结果

Pattern.compile(regex).matcher(str).replaceFirst(repl)

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

于 2012-08-31T04:27:11.783 回答