看完网上著名的30分钟学会正则表达式(http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html)的文章后,还是一片模糊,虽然对于基础的几个字母认识了,可是对于老大要求,抓取网页的指定内容来说,还是会云里雾里,
今天问了老大,学了一个新名词,其实文章里面有,我没有仔细看,叫做懒惰和贪婪定理.原文如下
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
总之就是.*是找最远的两端的内容
.*?是找最近的两端的内容
JsonUtil json=new JsonUtil(); String content=json.getJson("某个网址");//通过url读取整个静态页面的内容 content=content.replace("\\r\\n","");//这里要注意要把所有的换行符去掉,因为.*通配符不能匹配换行符 String str="id=\"ReplaceSpot_three_tag\".*?table+.*?table+.*?>(.+?)table";
//首先是id为ReplaceSpot_three_tag紧跟着.*?table表示匹配到最近的一个table的内容同样后面也是匹配到最近的 一个table结束的>括号里面是目标内容+表示必须出现的内容同样是最近到下一个table出现. Pattern p = Pattern.compile(str); Matcher m = p.matcher(content); while (m.find()) { String con=m.group(1);//这样就能拿到table下的所有tr System.out.println(con); String path="<tr>(.+?)</tr>";//这里匹配所有tr里面的内容,因为有很多tr,所以下面会循环输出tr里卖弄的内容
Pattern ps = Pattern.compile(path); Matcher ms = ps.matcher(con); while (ms.find()) { System.out.println(ms.group(1)); } }