项目场景:
处理从数据库里查出来的数据,需要将其中某个字段里的指定字符串换成其他字符串,如下:
问题描述:
使用replaceAll方法进行字符串替换,结果出现java.lang.IllegalArgumentException: Illegal group reference异常,如下:
原因分析:
String的replaceAll(regex, replacement)方法会调用java.util.regex.Matcher.appendReplacement(sb, replacement)方法,appendReplacement(sb, replacement)方法的源码如下:
从源码可以看到这里面对“$”符号和“\\”符号进行了处理;出现以上错误的原因是:String的replaceAll(regex, replacement)方法的第一个参数支持正则表达式,如果参数replacement中出现符号“$”,会按照$1$2的分组模式进行匹配;当编译器发现“$”后跟的不是整数的时候,就会抛出“Illegal group reference”的异常
解决方案:
用JDK提供的方法,对特殊字符进行处理:
replacement = java.util.regex.Matcher.quoteReplacement(replacement);
该方法对“$”符号跟“\\”符号添加了“\\”进行转义,于是上面报错的那行代码可改成:
expression = expression.replaceAll(funcId, java.util.regex.Matcher.quoteReplacement(resultStr));