我有以下代码:
String newStr = "aa\$";
print newStr;
print "wwwww ? eeee".replaceFirst("\\?", "'${newStr}'"); // (3)
我一直在 - 第3行 - 得到以下错误:
Caught: java.lang.IllegalArgumentException: Illegal group reference
at com.example.MyBuilder.main(MyBuilder.groovy:196)
看起来 replaceFirst 忽略了$被转义。我怎么能让我的代码运行?有没有人遇到这样的错误?
答案 0 :(得分:6)
第一
String newStr == "aa\$"
应该是
String newStr = "aa\$"
然后,因为您使用普通字符串来声明正则表达式,所以需要双重转义美元符号:
String newStr = "aa\\$"
或者,使用斜线字符串:
String newStr = /aa\$/
答案 1 :(得分:0)
我找到了解决问题的有效方法:String newStr == "aa\\\$";
你需要有三个反斜杠。第一个反斜杠(从右到左)转义$,因此Groovy Interpreter不理解$作为变量的标记。
以下两个斜杠必须为replaceFirst转义$,因为$由 Matcher.appendReplacement() 解释 - 在replaceFirst中调用 - 作为分组。这是意料之外的well documented in JavaDoc行为:
反斜杠(\)和美元符号($) 替换字符串可能会导致 结果与它不同 被视为文字 替换字符串
PS。在与逃避其他“特殊”符号 - 反斜杠战斗后,我切换到String.replace(CharSequence,CharSequence)。