Java Matcher.find()返回true但start()/end()/group()抛IllegalStateException
Java Matcher find()返回true但调用group()等方法抛IllegalStateException的解决思路
核心原因分析
这种矛盾现象的本质是:Matcher的内部匹配状态在find()返回true后被意外破坏,导致后续调用group()/start()/end()时,Matcher认为当前没有有效的匹配结果。
具体解决思路
改用不可变的String作为输入
你当前使用的StringBuffer是可变字符序列,若在find()之后、调用分组方法之前,该对象被任何代码(包括其他线程)修改,都会直接导致Matcher的内部状态失效。将输入替换为不可变的String即可彻底避免这个问题:Pattern xmlPattern = Pattern.compile("(<show.*?>.*?</show>)", Pattern.DOTALL); String content = "<broadway><show><hi/></show></broadway>"; Matcher m = xmlPattern.matcher(content); if (m.find()) { returnString = m.group(1); }排查多线程冲突
Matcher是线程不安全的,若多个线程共享同一个Matcher实例,会导致其内部状态混乱。确保每个线程使用独立的Matcher对象,或者对Matcher的访问逻辑加锁。检查是否存在隐藏的输入修改
仔细排查代码中m.find()到m.group(1)之间的逻辑,确认没有任何操作修改了原始的StringBuffer对象(比如buf.append()、buf.delete()等),哪怕是间接调用也会导致状态失效。验证正则表达式的有效性
虽然你的正则看起来能匹配目标字符串,但可以简化后测试:比如去掉非必要的.*?(如果<show>标签没有属性,可直接用(<show>.*?</show>)),排除正则本身的潜在问题。
内容的提问来源于stack exchange,提问作者Elly
相关产品推荐
相关产品推荐

