String str = "<u><i><b>2342</b></i></u>";
        Pattern p = Pattern.compile("<b>(.*)</b>", Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(str);
        while (m.find()) {
            System.out.println(m.group());
        }

解决方案 »

  1.   

    答非所问啊。值我会取这里U,I,B只是个例子,括号内是什么未知。。我想问为什么我那样写不行,而不是怎么取到
      

  2.   

    这应该和匹配顺序有关,<.*?>(?!<).+?</.*?> <的右边不能为<,根据传统NFA正则引擎的匹配原理,应该是先让前面的表达式满足条件,所以.*?>会从开头匹配到b>这个位置。非贪婪模式说的是在可匹配可不匹配的情况下,会忽略匹配,必须进行匹配才能匹配成功时,会进行匹配
      

  3.   

    楼主要知道正则中贪婪或者非贪婪的匹配是会吞进匹配的字符的,只是非贪婪的尽可能少的吞.
    Matcher的find都会从第一个位置开始搜索匹配串.
    <.*?>(?!<)这里正则会从第一个位置找到匹配的<后面紧跟着任意字符.尽可能少的尝试匹配任意字符后跟着是>紧接的着后面不是<的内容.吞到<u>这里的时候发现后面是<不符合继续吞.一直到<b>为止发现后面不是<所以你用<.*?>(?!<)是会把<u><i><b>都吞进去
      

  4.   

    不懂,他吞到<u>我能理解,也是我期望的,可是<u>后面是<,我那表达式是(?!<)我本意是想不匹配<现在到了<这里,不是应该不符合条件才是 ,为什么会匹配到<b>呢?
      

  5.   

    如果是 样的话,regex = (<.*?>).*?</.*?>这时group(1)就是<u>,这样看.*?>应该只会到<u>,可是加个(?!<)就不行了,不理解了
      

  6.   

     (<.*?>).*?</.*?>这个到u它就已经匹配成功了,不会再尝试重新匹配,如果加了(?!<),第一次匹配<.*?>到u时能匹配成功的,可是下一个位置不满足(?!<),所以会进行回溯,前面重新匹配