参考:常用API-09-正则表达式初体验和基本规则_哔哩哔哩_bilibili
目录
public String[] matches(String regex) 判断字符串是否满足正则表达式的规则
public String replaceAll(String regex, String newStr) 按照正则表达式的规则进行替换
正则表达式可以校验字符串是否满足定的规则,并用来校验数据格式的合法性。
作用
- 校验字符串是否满足规则
- 在一段文本中查找满足要求的内容
作用一: 校验字符串是否满足规则
例如:
需求:假如现在要求校验一个qq号码是否正确
规则:6位及20位之内,0不能在开头,必须全部是数字。
以前的方法:
public static boolean checkQQ(String qq){
//qq的长度为6~20
int len = qq.length();
if(len < 6 && len > 20){
return false;
}
//开头不能为0
if(qq.startsWith("0")){
return false;
}
//必须全部是数字
for (int i = 0; i < qq.length(); i++) {
char c = qq.charAt(i);
if(c < '0' || c > '9'){
return false;
}
}
return true;
}
使用正则表达式:
qq.matches(参数):参数为String类型的参数,该参数为正则表达式。该方法的返回类型为boolean型。
在正则表达式中,只要是数字就可以写"\\d"
//第一位为1-9的数字,后面是任意的数字,任意的数字有5-19位
qq.matches("[1-9]\\d{5,19}");
1. 字符类
!注意:只匹配一个字符
2. 预定义字符:(只匹配一个字符)
\ 转义字符:改变后面那个字符原本的含义
练习:以字符串的形式打印一个双引号
" 在java中表示字符串的开头或者结尾,此时\表示准一字符,改变了后面那个双引号原本的含义,把他变成了一个普普通通的双引号而已
System.out.println("\"");
\ 表示一个转义字符
\\ 前面的\ 是一个转义字符,改变了后面\ 原本的含义,把他变成了一个普普通通的\ 而已。
3. 数量词
以上内容可以在javaAPI帮助文档String-metches中查看
练习
拿着一个正确的数据,从左到右依次去看
1. 验证手机号码是否正确
2. 验证座机号码是否正确
3. 忽略大小写的书写方式
abc的大小写都忽略:String regex = "(?i)abc";
只忽略bc的大小写 : String regex2 = "a(?i)bc";
只忽略b的大小写 String regex3 = "a((?i)b)c";
4. 身份证号码的简单校验
5. 身份证号码的严格校验
正则表达式总结
插件
可以在在File-settings-Plugins中安装正则表达式的插件
正则表达式编写心得
- 按照正确的数据进行拆分
- 找每一部分的规律,并编写正则表达式
- 把每一部分的正则拼接在一起,形成最终的正则表达式。
作用二: 在一段文本中查找满足要求的内容 --- 爬虫
类
Pattern:表示正则表达式
Matcher:文本匹配器,作用:按照正则表达式的规则去读取字符串,从头开始读取,在大串中去找符合匹配规则的子串。
本地爬虫
public class Demo2 {
public static void main(String[] args) {
String str = "Java自从95年间以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,"+
"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//1. 获取正则表达式的对象
Pattern p = Pattern.compile("Java\\d{0,2}");
//2. 获取文本匹配器的对象
//拿着m去读取str,找符合p规则的子串
Matcher m = p.matcher(str);
//3. 利用循环获取
while(m.find()){
String s = m.group();
System.out.println(s);
}
}
}
网络爬虫
暂时了解即可
练习
练习1:本地爬虫
练习2: 有条件的爬取数据
需求1
public class Demo3 {
public static void main(String[] args) {
String str = "Java自从95年间以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,"+
"因为这两个是长期支持版本,下一个长期支持版本是JAva17,相信在未来不久JAVA17也会逐渐登上历史舞台";
//1. 定义正则表达式
//?表示前面内容(Java) =表示Java后面要跟随的内容
//但是在获取的时候只获取前半部分
String regex = "((?i)Java)(?=8|11|17)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while(m.find()){
System.out.println(m.group());
}
}
}
需求2
//需求2
String regex2 = "((?i)Java)(?:8|11|17)";
String regex3 = "((?i)Java)(8|11|17)";//regex2 和 regex3 都可以表示
Pattern p = Pattern.compile(regex2);
Matcher m = p.matcher(str);
while(m.find()){
System.out.println(m.group());
}
需求3
//需求3
String regex4 = "((?i)Java)(?!8|11|17)";
Pattern p = Pattern.compile(regex4);
Matcher m = p.matcher(str);
while(m.find()){
System.out.println(m.group());
}
练习3:贪婪爬取和非贪婪爬取
只写+和*表示贪婪爬取,+? 或者*? 表示非贪婪爬取 ;
贪婪爬取:在爬取数据的时候尽可能多的获取数据
非贪婪爬取:在爬取数据的时候尽可能少的获取数据
Java中,默认的是贪婪爬取,如果我们在数量词+ * 的后面加上问号,那么此时就是非贪婪爬取。
正则表达式在字符串方法中的使用
public String[] matches(String regex) 判断字符串是否满足正则表达式的规则
public String replaceAll(String regex, String newStr) 按照正则表达式的规则进行替换
细节:
方法在底层跟之前一样也会创建文本解析器的对象,然后从头开始去读取字符串中的内容,只要有满足的,那么就用第二个参数去替换。
public String[] split(String regex) 按照正则表达式的规则切割字符串
分组
分组就是一个小括号
每组是有组号的,也就是序号。
规则
- 从1开始,连续不间断
- 以左括号为基准,最左边的是第一组,其次为第二组,以此类推
例如:(红色为第一组,蓝色为第二组,绿色为第三组)
捕获分组
捕获分组就是把这一组的数据捕获出来,再用一次
后续还要继续使用本组的数据
正则内部使用:\\组号
正则外部使用:$组号
练习
public class Demo4 {
public static void main(String[] args) {
String str = "我要学学编编编编编程程程程程程程程";
String result = str.replaceAll("(.)\\1+", "$1");
System.out.println(result);
}
}
非捕获分组
分组之后不需要再使用本组数据,仅仅是把数据括起来
特点
不占用括号
总结
- 张泽表达式中分组有两种:捕获分组和非捕获分组
- 捕获分组(默认):可以获取每组中的内容反复使用
- 组号的特点:从1开始,连续不间断;以左括号为基准,最左边的是第一组
- 非捕获分组:分组之后不需要再用本组数据,仅仅把数据括起来,不占组号。(?:) (?=) (?!)都是非捕获分组。