萬能正則公式 獲取兩個字符串之間的字符串
本表達式適用的場景是比較小的爬蟲,需要快速編寫測試的時候用的,速度肯定會比常規經過優化的正則表達式慢.如果對解析速度有要求的話,建議使用Jsoup對html進行解析或者寫常規的正則語句進行解析.
如需詳細的正則教程,建議直接翻文檔
表達式
(.*?)
- 括號的意思就是要取的字符串
- 英文句號表示任意字符
- *號表示前一個出現0或者無數次
- ?號的意思是非貪婪抓取(去掉的話只會返回最遠端的尾部)
總結起來就是 非貪婪地抓取任意字符出現0到無數次 需要獲取哪裏就把這個插到哪裏
看個例子,我需要獲取 url 和 123 兩個字段
String text = "<a herf=\"url\">123<a>"
Pattern p = Pattern.compile("<a herf=\"(.*?)\">(.*?)<a>");
Matcher m = p.matcher(html);
while(m.find()){//每調用一次都會返回一個
System.out.println(m.group(0));//0是抓取到的整一段,所以數組從1開始
String url = m.group(1);
String title = m.group(2);
}
擴展一下
假如我想要的有可能沒有,這樣的話就適配不了.我們可以在外面再加一個括號
String text = "<p id=\"title\">標題</p><a herf=\"url\">123<a><div id=\"banner\"></div>"
Pattern p = Pattern.compile("<p id=\"title\">(.*?)</p>(<a herf=\"(.*?)\">(.*?)<a>)?<div id=\"(.*?)\"></div>");
Matcher m = p.matcher(html);
while(m.find()){//每調用一次都會返回一個
System.out.println(m.group(0));//0是抓取到的整一段,所以數組從1開始
String url = m.group(1);
String title = m.group(2);
}
<p id=\"title\">標題</p><a herf=\"url\">123<a><div id=\"banner\"></div>
<p id=\"title\">標題</p><div id=\"banner\"></div>
a標籤有可能在有可能不在,如果不在的話我們的(.*?)肯定匹配不到,所以其他信息也匹配不到了,這裏我們在a標籤外圍也加一個()? 這樣無論他在不在我們也可以匹配到其他了.
再說一遍本表達式適用的場景是需要快速編寫爬蟲測試的時候用的,如果要快的話,可以瞭解一下Jsoup或者正則的優化,寫出更快解析的代碼.沖沖衝!!!