JAVA ---> API(3) --- 正则表达式(爬虫)

本文介绍了正则表达式的基本概念,如校验字符串格式、在文本中查找特定内容(爬虫),并详细讲解了字符类、预定义字符、数量词等核心概念,以及如何在Java中使用正则表达式进行字符串操作和爬虫练习示例。
摘要由CSDN通过智能技术生成

 参考:常用API-09-正则表达式初体验和基本规则_哔哩哔哩_bilibili

目录

作用

作用一: 校验字符串是否满足规则

1. 字符类

2. 预定义字符:(只匹配一个字符)

3. 数量词

 练习

1. 验证手机号码是否正确

2. 验证座机号码是否正确

3. 忽略大小写的书写方式

​4. 身份证号码的简单校验

 5. 身份证号码的严格校验

正则表达式总结

  插件

 正则表达式编写心得

作用二: 在一段文本中查找满足要求的内容 --- 爬虫

本地爬虫

网络爬虫

练习

练习1:本地爬虫

练习2: 有条件的爬取数据 

 练习3:贪婪爬取和非贪婪爬取

​正则表达式在字符串方法中的使用

public String[] matches(String regex) 判断字符串是否满足正则表达式的规则

 public String replaceAll(String regex, String newStr) 按照正则表达式的规则进行替换

 分组

 捕获分组

​编辑 练习

 非捕获分组

特点

总结


正则表达式可以校验字符串是否满足定的规则,并用来校验数据格式的合法性。

作用

  1. 校验字符串是否满足规则
  2. 在一段文本中查找满足要求的内容

作用一: 校验字符串是否满足规则

例如:

需求:假如现在要求校验一个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中安装正则表达式的插件

 正则表达式编写心得

  1. 按照正确的数据进行拆分
  2. 找每一部分的规律,并编写正则表达式
  3. 把每一部分的正则拼接在一起,形成最终的正则表达式。

作用二: 在一段文本中查找满足要求的内容 --- 爬虫

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. 从1开始,连续不间断
  2. 以左括号为基准,最左边的是第一组,其次为第二组,以此类推

例如:(红色为第一组,蓝色为第二组,绿色为第三组)

 捕获分组

捕获分组就是把这一组的数据捕获出来,再用一次

后续还要继续使用本组的数据

正则内部使用:\\组号

正则外部使用:$组号

 

 

 练习

 

public class Demo4 {
    public static void main(String[] args) {
        String str = "我要学学编编编编编程程程程程程程程";
        String result = str.replaceAll("(.)\\1+", "$1");
        System.out.println(result);
    }
}

 非捕获分组

分组之后不需要再使用本组数据,仅仅是把数据括起来

特点

不占用括号

 

总结

  1. 张泽表达式中分组有两种:捕获分组和非捕获分组
  2. 捕获分组(默认):可以获取每组中的内容反复使用
  3. 组号的特点:从1开始,连续不间断;以左括号为基准,最左边的是第一组
  4. 非捕获分组:分组之后不需要再用本组数据,仅仅把数据括起来,不占组号。(?:) (?=) (?!)都是非捕获分组。 
  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值