一、概念
贪婪爬取:在爬取数据的时候尽可能的多获取数据
非贪婪爬取:在爬取数据的时候尽可能的少获取数据
二、需求1
需求:有如下文本,按要求爬取数据。
Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa,经历了很多版木,目前企业中用的最多的是]ava8和]ava11,因为这两个是长期支持版木。下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
需求1:按照ab+的方式爬取ab,b尽可能多获取(前面的 ab+ 是一个正则表达式,由于ab没有使用小括号进行分组,因此这里的 ab+ 表示的是:b出现一次或多次)
在这里,如果使用贪婪爬取,就是尽可能将后面的 b
都获取到,这就是贪婪爬取。
abbbbbbbbbbbb
非贪婪爬取:尽可能少获取,ab
就已经满足 ab+
的要求了,因此直接获取 ab
就行了。
在Java中,默认的就是贪婪爬取。
如果我们在数量词(eg:+
、*
) 后面加上 ?
,那么此时就是非贪婪爬取。
String regex = "ab+";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group()); // abbbbbbbbbbbb,这就是贪婪爬取
}
但是这个 b
我不想获取这么多,后面加个 ?
就行了。
String regex = "ab+?";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group()); // ab,这就是非贪婪爬取
}