加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式的最大最小原则(就是懒惰和贪婪定理),java版本

发布时间:2020-12-14 02:22:35 所属栏目:百科 来源:网络整理
导读:看完网上著名的30分钟学会正则表达式(http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html)的文章后,还是一片模糊,虽然对于基础的几个字母认识了,可是对于老大要求,抓取网页的指定内容来说,还是会云里雾里, 今天

看完网上著名的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("rn","");//这里要注意要把所有的换行符去掉,因为.*通配符不能匹配换行符
		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));
		   }
		    
		   
		}  

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读