当前位置:   article > 正文

Java异常:java.lang.IllegalArgumentException: Illegal group reference: group index is missing

java.lang.illegalargumentexception: illegal group reference

一、问题现象

1.使用replaceFirst方法或者replaceAll方法替换时,吐过替换成为的字符串中含有"$",则会抛出标题中的异常。

2.使用replace方法替换时,会替换成功。

  1. String fieldName = "?progressUrl";
  2. String replacement = "$";
  3. System.out.println(fieldName.replace("?", replacement));
  4. System.out.println(fieldName.replaceFirst("\\?",replacement));
  5. System.out.println(fieldName.replaceAll("\\?",replacement));

 ps:replace方法的第一个参数为target,replaceFirst和replaceAll方法的第一个参数为regex(正则)

二、问题原因

replaceFirst():

1.查看replaceFirst方法的源码

2.替换成的对象replacement不为null,所以走下面逻辑,进入appendReplacement方法中

3.在appendReplacement方法中nextChar=“$”,所以走到红框中的if中,抛出异常

replaceAll():

1.查看replaceAll方法的源码

 2.result为true,进入if中,也遇到了appendReplacement方法

3. 进入到appendReplacement方法中,走和replaceFist相同的逻辑,同样抛出标题中异常 

replace():

1.查看replace()源码,内部调用了replaceAll()

所以思考,使用replaceFirst和replaceAll时候也采用replace内部的实现方式

 2.进入到replaceAll中,发现会自动给replacement前面添加"\"

 三、解决方案

将代码调整为:Matcher.quoteReplacement(replacement),以上问题解决。

  1. String fieldName = "?progressUrl";
  2. String replacement = "$";
  3. System.out.println(fieldName.replace("?", replacement));
  4. // System.out.println(fieldName.replaceFirst("\\?",replacement));
  5. // System.out.println(fieldName.replaceAll("\\?",replacement));
  6. System.out.println(fieldName.replaceFirst("\\?", Matcher.quoteReplacement(replacement)));
  7. System.out.println(fieldName.replaceAll("\\?",Matcher.quoteReplacement(replacement)));

输出结果:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/214050
推荐阅读
相关标签
  

闽ICP备14008679号