如何在java中逃避$?

时间:2012-08-31 04:17:36

标签: java regex special-characters

我正在尝试下面的代码,但收到错误

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 个答案:

答案 0 :(得分:6)

使用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

答案 1 :(得分:3)

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

Matcher.quoteReplacement()

所以改变

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

String z = Matcher.quoteReplacement(y);

答案 2 :(得分: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

答案 3 :(得分:0)

replaceFirst导致的问题ID String z=y.replaceAll("$", "\\$");的值为xy$z$

将与给定正则表达式匹配的此字符串的第一个子字符串替换为给定的替换。 调用str.replaceFirst(regex, repl)形式的此方法会产生与表达式

完全相同的结果
Pattern.compile(regex).matcher(str).replaceFirst(repl)

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