首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

正则表达式有关问题 纠结

2013-12-20 
正则表达式问题 纠结private static void test() {String str uib2342/b/i/uPattern p

正则表达式问题 纠结



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时能匹配成功的,可是下一个位置不满足(?!<),所以会进行回溯,前面重新匹配

热点排行