`
javasogo
  • 浏览: 1777585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

String 方法 replaceFirst 、replaceAll 和 No group Exception

阅读更多
今天被OA的一个问题搞得很无语,m.appendReplacement(sb, bodyArr[j]);报索引溢出的异常,找了半天的原因。后来几经周折才连接正式系统,跟踪里面的异常。
结果发现是String的使用过程中出现节点越界
java.lang.IndexOutOfBoundsException: No group 2
at java.util.regex.Matcher.group(Matcher.java:355)
at java.util.regex.Matcher.appendReplacement(Matcher.java:585)
at java.util.regex.Matcher.replaceFirst(Matcher.java:701)
at java.lang.String.replaceFirst(String.java:1630)
当时我就纳闷,contentStr.replaceFirst(fromStr, toStr) 这方法中处理的内容会越界?why?
contentStr,fromStr, toStr在项目中都是不可能为null,即便为null值那也应该是抛NullpointException异常才对;又或者压根没替换,那也不会有异常啊......
说实话,当时的我压根不会想到是JDK API本身的问题,那些代码逻辑都是几经磨练和测试okay后才成为了API的,肯定是我写代码的某些地方出了问题。可就是找不出破绽来。
只好到google谷歌了一下,结果发现有网友留言说此种情况算是Matcher的一个bug来的。
晕,之前居然老以为是自己代码出了漏洞。看来今后不能那么迷信权威了。
结果那网友说了是Matcher做替换时replaceAll 或者 replaceFirst 时,会对字符串中的“$”符号敏感,出现IndexOutOfBoundsException的问题,如上面的contentStr.replaceFirst(fromStr, "xx$xx")就会出错。摘录下网友的留言 in blue:
You have to track through the documentation quite carefully to discover that the characters \ and $ have a special 
meaning in the replacement string.  It could be helpful to copy this sentence from Matcher.replaceAll into all 
of String.replaceFirst, String.replaceAll, and Matcher.replaceFirst:

"Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than 
if it were being treated as a literal replacement string."
呵呵,这才想起似乎之前测试数据库中都没有含“$”符号的数据,偏巧正式数据库中有这些记录。 额的神!难怪之前测不出来。
不过总算知道问题根源了,呵呵,强行过滤Str中的“$”符号,替换后再还原它的“$”面目。
搞定!!!
分享到:
评论

相关推荐

    Java中replace、replaceAll和replaceFirst函数的用法小结

    相信会java的同学估计都用过replace、replaceAll、replaceFirst这三个函数,可是,我们真的懂他们吗?下面通过这篇文章大家再来好好学习学习下这几个函数。

    Java中replace和replaceAll的区别

    replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是:  1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也是字符串);  2)...

    正则表达式

    2、 String类也提供了几个和正则表达式有关的几个特殊方法 1) Boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。 2) String replaceAll(String regex,String replacement):返回该字符串中...

    简单了解Java删除字符replaceFirst原理及实例

    主要介绍了简单了解Java删除字符replaceFirst原理及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    64进制任意转换

    spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override ... String newStr = tmp2.replaceFirst("^0*", ""); editText2.setText(newStr); } } } } });

    eregi_replace()中特殊字符的处理方法

    我对PHP的正则表达式不太熟悉 在使用eregi_replace()函数时发现带有... 最后因为字符串中含有括号而无法处理 现在我知道这样写不对了,但不知道正确的写法是什么 那位大侠可以教教我这种问题的处理方法? 还有, 

    changeurl:一个简单的Web应用程序,可通过正则表达式更改网址

    该应用程序仅通过查询字符串接收网站和正则表达式替换,然后将您发送到使用正则表达式... 最后还需要一个布尔值来说明它是replaceFirst()还是replaceALL()(所有人为true,首先为false)。 例如:“ 会将您转发到

    Java中获取子字符串的几种方法示例

    主要主要给大家总结了Java中获取子字符串的几种方法,分别是采用split的方式、采用indexOf的方式、正则和采用replaceFirst的方式这四种方法,需要的朋友可以参考借鉴,下面来看看详细的介绍吧

    详解Spring的StringUtils踩坑记录

    主要介绍了详解Spring的StringUtils踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Global site tag (gtag.js) - Google Analytics