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

前端之家收集整理的这篇文章主要介绍了正则表达式的最大最小原则(就是懒惰和贪婪定理),java版本前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

看完网上著名的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));
		   }
		    
		   
		}  

猜你在找的正则表达式相关文章