本地爬虫
- Pattern:表示正则表达式
- Matcher:文本匹配器,按照正则表达式的规则去读取字符串,从头开始读取,在大串中去找符合匹配规则的子串
package top.aboss;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Hello {
public static void main(String[] args) {
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台。";
// 1. 获取正则表达式对象
Pattern p = Pattern.compile("Java\\d{0,2}");
// 2. 获取文本匹配器对象
Matcher m = p.matcher(str);
// 3. 利用循环获取
while (m.find()) {
String s = m.group();
System.out.println(s);
}
}
}
网络爬虫
package top.aboss;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Hello {
public static void main(String[] args) throws IOException {
// 创建URL对象
URL url = new URL("https://www.cnblogs.com/longronglang/p/6429260.html");
// 连接上这个网址
URLConnection conn = url.openConnection();
// 创建对象去读取网络中的数据
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// 获取正则表达式对象pattern
String regex = "[1-9]\\d{17}";
Pattern pattern = Pattern.compile(regex);// 在读取的时候每次读一整行
String line;
while ((line = br.readLine()) != null) {
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
br.close();
}
}
分组
每组是有组号的,也就是序号。
- 规则1:从1开始,连续不间断
- 规则2:以左括号为基准,最左边的是第一组,其次为第二组,以此类推
捕获分组
就是把这一组的数据捕获出来,再用一次。后续还要继续使用本组的数据,正则内部使用:\\组号
,正则外部使用:$组号
。
package top.aboss;
public class Hello {
public static void main(String[] args) {
// 判断字符串开始和结束是否一致
// \\组号 表示把第X组的内容再拿出来用一次
String reg = "(.+).+\\1";
System.out.println("a123a".matches(reg));
System.out.println("abc123abc".matches(reg));
// 判断字符串开始和结束是否一致,并且开始部分每个字符需要一致
String reg2 = "((.)\\2*).+\\1";
System.out.println("aaa123aaa".matches(reg2));
// 口吃替换
String reg3 = "(.)\\1+";
System.out.println("我要学学编编编编程程程程程程".replaceAll(reg3, "$1"));
}
}
非捕获分组
分组之后不需要再用本组数据,仅仅是把数据括起来,特点是不占用组号。
package top.aboss;
public class Hello {
public static void main(String[] args) {
// 身份证号码简易正则表达式
String reg = "[1-9]\\d{16}(?:\\d|X|x)";
System.out.println("41080119930228457x".matches(reg));
}
}
(?:) (?=) (?!)都是非捕获分组,更多的是使用第一个。