正則表達式的最大最小原則(就是懶惰和貪婪定理),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));
		   }
		    
		   
		}  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章