目录
1.正则表达式的作用
作用一:检验字符串是否满足规则
作用二:在一段文本中查找满足要求的内容
1.检验字符串是否满足规则
字符类(只匹配一个字符):
预定义字符(只匹配一个字符):
注意:
转义字符:转义字符通过在普通字符前加上一个特定的前缀(通常是反斜杠“\”)来表示,这个前缀使得紧随其后的字符具有了不同的含义或作用。
\\:前面的\是一个转义字符,改变了后面\原本的含义,把他变成一个普普通通的\而已。
数量词:
[] 里面的内容出现一次
() 分组
(?i)abc 忽略abc的大小写
((?i)a)bc 忽略a的大小写
2. 在一段文本中查找满足要求的内容(爬虫)
a.Pattern类
1.概述
表示正则表达式
2实例化对象(静态方法)
3方法(爬虫)
CharSequence 被爬虫东西
b.Matcher类
1.概述
文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读。在大串中去找符合规则的子串
2.方法(爬虫)
a.查看是否爬到数据
底层原理:拿着文本匹配器从头开始读取,寻找是否满足规则的子串,如果没有方法返回false,如果有,返回true,在底层记录子串的起始索引和结束索引+1(subString截取)
b.取出爬到的数据
爬虫步骤:
1.获取Pattern对象
通过Pattern p = Pattern.compile("正则表达式");
2.获取Matcher对象
通过Matcher m = p.matcher(str);获得 (m要在str中找符合p规则的小串),其中, m为Matcher对象, p为正则表达式规则, str为要验证的字符串
3.匹配文本中的对象
boolean b = m.find(); 表示拿着文本匹配器从头开始读取,寻找是否有满足规则的子串如果没有,方法返回false. 如果有,返回true。在底层记录子串的起始索引和结束索引+1
4.截取文本匹配器索引
String s = m.group(); 这时文本匹配器会停留在第一个匹配文本的结束索引+1处, 返回一个文本中索引为(0,4)不包含4索引的字符串(符合规则的)
5.继续匹配和获取索引
重复第3步和第4步, 从上一次停留的地方开始向后查找
c.有条件的爬取数据
String regex="Java(?=8|11|17)"; 将Java8、Java11、Java17中的Java爬取出来
String regex="Java(?:8|11|17)"; 将Java8、Java11、Java17爬取出来
String regex="Java(?!8|11|17)"; 将除了Java8、Java11、Java17以外的Java爬取出来
d.贪婪爬取和非贪婪爬取
贪婪爬取:尽可能多地文本
例如:假设有一个字符串abbbbbbbbbbaaaaaa,并且你使用正则表达式ab+来匹配。由于贪婪匹配的特性,正则表达式会尽可能多地匹配b字符,因此匹配结果将是abbbbbbbbbbb。
非贪婪爬取:尽可能少的匹配字符
例如:abbbbbbbbbbbaaaaaa,但这次使用正则表达式ab+?来匹配。由于非贪婪匹配的特性,正则表达式会尽可能少地匹配b字符,因此匹配结果将是ab。
3.利用正则表达式替换字符串
4.捕获分组和非捕获分组
分组:
规则1:从1开始,连续不间断
规则2:以左括号为基准,最左边的是第一组,其次为第二组,以此类推
a.捕获分组
概述:后续还要继续使用本组的数据
正则内部的使用:\\组号
正则外部的使用:$组号
public class Main {
public static void main(String[] args) {
String str="我要学学编编编编程程";
String regex="(.)\\1+";//替换前的数据
String replacement="$1";//替换后的内容
String result=str.replaceAll(regex,replacement);
System.out.println(result);
}
}
b.非捕获分组
仅仅是把数据阔前来,不占用组号
(?:)(?=)(?!)都是非捕获分组