日期:2014-05-20  浏览次数:20705 次

正则表达式问题 纠结


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

这里我想得到<b>2342</b> 本以为这样要以,可是不行。我用regex ="<.>(?!<).+?</.*?>" 就可以,当然还有其它的实现方式,这里我就不明白为什么这样不行??难不成非贪婪和预搜索不能在一起?如果是的话又是为什么哩?纠结ing

------解决方案--------------------
楼主要知道正则中贪婪或者非贪婪的匹配是会吞进匹配的字符的,只是非贪婪的尽可能少的吞.
Matcher的find都会从第一个位置开始搜索匹配串.
<.*?>(?!<)这里正则会从第一个位置找到匹配的<后面紧跟着任意字符.尽可能少的尝试匹配任意字符后跟着是>紧接的着后面不是<的内容.吞到<u>这里的时候发现后面是<不符合继续吞.一直到<b>为止发现后面不是<所以你用<.*?>(?!<)是会把<u><i><b>都吞进去
------解决方案--------------------
 (<.*?>).*?</.*?>这个到u它就已经匹配成功了,不会再尝试重新匹配,如果加了(?!<),第一次匹配<.*?>到u时能匹配成功的,可是下一个位置不满足(?!<),所以会进行回溯,前面重新匹配