正则表达式
1.基本语法:符号即规则
1.1 匹配"单个字符"的元字符

1.2 控制"匹配次数"的元字符

2.爬取
2.1带条件爬取
java
String s = "java自从95年问世以来,经历了很多版本,目前企业中用的最多的是JAva8和Java11,"
+"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久JaVa17也会逐渐登上历史舞台";
//1.定义正则表达式
//?理解问前面的数据Java
//=表示在Java后面要紧随的数据
//但是在获取的时候,只获取前半部分
//?i忽视大小写
//需求1. JAva Java Java JaVa
String rex1 = "(?i)(java)(?=11|17|8)";
//需求2. JAva8 Java11 Java17 JaVa17
String rex2 = "(?i)(java)(11|17|8)";
String rex3 = "(?i)(java)(?11|17|8)";
//需求3. java
String rex4 = "(?i)(java)(?!11|17|8)";
Pattern p = Pattern.compile(rex4);
Matcher m = p.matcher(s);
while(m.find()){
System.out.println(m.group());
}
}
2.2贪婪爬取
贪婪爬取:在爬取数据的时候尽可能多的获取数据
非贪婪爬取:在爬取数据的时候尽可能少的获取数据
java
public static void main(String[] args) {
//贪婪爬取:在爬取数据的时候尽可能多的获取数据
//非贪婪爬取:在爬取数据的时候尽可能少的获取数据
String s = "abbbbbbbbbbb";
String rex1 = "ab+";//abbbbbbbbbbb
String rex2 = "ab+?";//ab
//1,先创建正则表达式的对象
Pattern p = Pattern.compile(rex2);
//2.创建一个文档扫描器,利用m在s中寻找p规则的字符串
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group());
}
}
3.替换和分割
Java
String S = "adfnefnsef小白daafawf小兰";
//1.按照正则表达式的规则进行替换
String vs = S.replaceAll("[\\w&&[^_]]+", "vs");
System.out.println(vs);//vs小白vs小兰
//2.按照正则表达式的规则就行分割
String[] split = S.split("[\\w&&[^_]]+");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);//小白 小兰
}
4.分组
组号的特点: 从1开始,连续不间断
以左括号为基准,最左边的是第一组
4.1捕获性分组
捕获分组:判断一个字符串的开始部分和结尾部分是否一致?可以有多个字符
正则内部使用:\\组好
正则外部使用:$组好
Java
//捕获分组
//判断一个字符串的开始部分和结尾部分是否一致?可以有多个字符
String s = "asd123a";
String z = "bbb123bbb";
String d = "dsd123dsd";
String rex1 = "(.)+.+\\1";
boolean result = s.matches(rex1);
System.out.println(result);
// (.)把首字符看成一组
// \\1把首字符拿出来再次使用
// * 作用于\\1 表示后面重复的内容重复0次或多次
String rex2 = "((.)\\2*).+\\1";
boolean result2 = z.matches(rex2);
System.out.println(result2);//true
String rex3 = "(.+).+\\1";
boolean result3 = d.matches(rex3);
System.out.println(result3);
// 后续还要继续使用本组的数据
//正则内部使用:\\组好
//正则外部使用:$组好
String rex4 = "我我我要学学学编程";
String s1 = rex4.replaceAll("(.)\\1+", "$1");
System.out.println(s1);//我要学编程
4.2非捕获性分组
非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来
Java
//非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来
//(?:正则) 获取所有
//(?=正则) 获取前面部分
//(?!正则) 获取不是置顶内容的前面部分
//特点不占用组号
//\\1 报错的原因是(?:)非捕获分组,此时是不占用组号
String rex5 ="[1-9]{16}(?:\\d|x|X)\\1";
boolean matches = s.matches(rex5);
}