Groovy中的replaceFirst抛出非法组引用

时间:2011-03-15 08:24:55

标签: regex groovy

我有以下代码:

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 忽略了$被转义。我怎么能让我的代码运行?有没有人遇到这样的错误?

2 个答案:

答案 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)