看完网上著名的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)); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。