萬能正則公式 獲取兩個字符串之間的字符串 適應大多數場景

萬能正則公式 獲取兩個字符串之間的字符串

本表達式適用的場景是比較小的爬蟲,需要快速編寫測試的時候用的,速度肯定會比常規經過優化的正則表達式慢.如果對解析速度有要求的話,建議使用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或者正則的優化,寫出更快解析的代碼.沖沖衝!!!

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