万能正则公式 获取两个字符串之间的字符串
本表达式适用的场景是比较小的爬虫,需要快速编写测试的时候用的,速度肯定会比常规经过优化的正则表达式慢.如果对解析速度有要求的话,建议使用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或者正则的优化,写出更快解析的代码.冲冲冲!!!