当前位置: 首页 > news >正文

java后端开发day27--常用API(二)正则表达式爬虫

在这里插入图片描述
(以下内容全部来自上述课程)
在这里插入图片描述

1.正则表达式(regex)

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

1.作用

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

2.内容定义

请添加图片描述
ps:一个[]只能匹配一个字符。
\:转义字符,改变后面那个字符原本的含义
\:前面的\是一个转义字符,改变了后面的\原本的含义,把他变成成一个普普通通的\而已。
简单来记:两个\表示一个
请添加图片描述
API文档:Pattern会有正则表达式的解释,所以不需要去背。
插件:any-rule:右键可以插入想要的正则表达式:可以删去首尾的^和$符号,再把一个\加为两个\。
补充:(?i)忽略后面字母的大小写
请添加图片描述

2.爬虫

正则表达式的第二个作用:在一段文本中查找满足要求的内容。
分为:本地爬虫和网络爬虫。
Pattern:表示正则表达式。
Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。在大串中去找符合匹配规则的子串。

1.本地爬虫

有如下文本,请按要求爬取数据。
Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,
因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
要求:找出里面所有的JavaXX

package RegexDemo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo1 {
    /*有如下文本,请按要求爬取数据。
    Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,
    因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
    要求:找出里面所有的JavaXX*/
    public static void main(String[] args) {

        String str = "Java自从95年问世以来,经历了很多版本," +
                "目前企业中用的最多的是Java8和Java11," +
                "因为这两个是长期支持版本,下一个长期支持版本是Java17," +
                "相信在未来不久Java17也会逐渐登上历史舞台";

        //method1(str);


        //1.获取正则表达式对象
        Pattern pattern = Pattern.compile("Java\\d{0,2}");
        //2.获取匹配器对象
        //拿着matcher对象去读取str
        Matcher matcher = pattern.matcher(str);
        //3.开始读取
        while(matcher.find()) {
            String s = matcher.group();
            System.out.println(s);
        }
    }

    private static void method1(String str) {
        //获取正则表达式对象
        Pattern pattern = Pattern.compile("Java\\d{0,2}");
        //获取匹配器对象
        //m:文本匹配器的对象
        //str:大串
        //p:规则
        //m要在str中找到符合p规则的小串
        Matcher m = pattern.matcher(str);

        //拿着文本匹配器从头开始读取,寻找是否有满足规则的子串
        //如果没有,返回false
        //如果有,返回true。在底层记录子串的起始索引和结束索引+1
        //0,4
        boolean b = m.find();

        //方法底层会根据find方法记录的索引,从大串中截取子串
        //subString(起始索引,结尾索引);包含起始索引,不包含结尾索引
        //0,4 [0,4) 不包含4索引
        //会把截取的子串返回
        String s1 = m.group();
        System.out.println(s1);

        //继续寻找
        b = m.find();
        String s2 = m.group();
        System.out.println(s2);
    }
}

2.网络爬虫(了解)

请添加图片描述

3.带条件的爬取

有如下文本,请按要求爬取数据。
Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,
因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
需求1:爬取版本号为8,11,17的Java文本,但是只要Java,不显示版本号。
需求2:爬取版本号为8,11,17的Java文本。正确爬取结果为:Java8,Java11,Java17,Java17
需求3:爬取除了版本号为8,11,17的Java文本。

package RegexDemo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo2 {
    /*有如下文本,请按要求爬取数据。
    Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,
    因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
    需求1:爬取版本号为8,11,17的Java文本,但是只要Java,不显示版本号。
    需求2:爬取版本号为8,11,17的Java文本。正确爬取结果为:Java8,Java11,Java17,Java17
    需求3:爬取除了版本号为8,11,17的Java文本。*/
    public static void main(String[] args) {
        String str = "Java自从95年问世以来,经历了很多版本," +
                "目前企业中用的最多的是Java8和Java11," +
                "因为这两个是长期支持版本,下一个长期支持版本是Java17," +
                "相信在未来不久Java17也会逐渐登上历史舞台";

        //1.定义正则表达式
        //?理解为前面的数据Java
        //=表示在Java后面要跟随的数据
        //()但是获取的时候,只获取前半部分
        //需求1:
        String regex1 = "Java(?=8|11|17)";
        //需求2:
        String regex2 = "Java(8|11|17)";
        String regex3 = "Java(?:8|11|17)";
        //需求3:
        String regex4 = "Java(?!8|11|17)";

        Pattern pattern = Pattern.compile(regex4);
        Matcher matcher = pattern.matcher(str);
        while(matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

4.贪婪爬取和非贪婪爬取

有如下文本,请按要求爬取数据。
Java自从95年问世以来,abbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaa,经历了很多版本,目前企业中用的最多的是Java8和Java11,
因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
需求1:按照ab+的方法爬取ab,b尽可能多获取 --------------贪婪爬取
需求2:按照ab+的方法爬取ab,b尽可能少获取 --------------非贪婪爬取

Java当中,默认的就是贪婪爬取
如果我们在数量词+ *的后面加上问号,就是非贪婪爬取。

package RegexDemo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo3 {
    /*有如下文本,请按要求爬取数据。
    Java自从95年问世以来,abbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaa,
    经历了很多版本,目前企业中用的最多的是Java8和Java11,
    因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
    需求1:按照ab+的方法爬取ab,b尽可能多获取  --------------**贪婪爬取**
    需求2:按照ab+的方法爬取ab,b尽可能少获取  --------------**非贪婪爬取***/
    public static void main(String[] args) {
        String str = "Java自从95年问世以来,abbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaa, " +
                "经历了很多版本,目前企业中用的最多的是Java8和Java11, " +
                "因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
        String regex1 = "ab+";
        String regex2 = "ab+?";
        Pattern pattern = Pattern.compile(regex1);
        Matcher matcher = pattern.matcher(str);
        while(matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

3.正则表达式在字符串中的使用

请添加图片描述

4.分组

分组就是个小括号。
请添加图片描述

每组是有组号的,也就是序号。

  • 从1开始,连续不间断。
  • 以左括号为基准,最左边的是第一组,其次为第二组。

1.捕获分组

捕获分组就是把这一组的数据捕获出来,再用一次。
后续还需要使用本组的数据:

  • 正则内部使用:\组号
  • 正则外部使用:$组号
    请添加图片描述
//需求1:
String regex1 = "(.).+\\1";
//需求2:
String regex2 = " (.+).+\\1";
//需求3:
//(.):把首字母看成一组
//\\2:把首字母拿出来再次使用
//*:作用于\\2,表示后面重复的内容出现0次或多次
String regex3 ="((.)\\2*).+\\1";

将字符串:我要学学编编编编程程程程程程
替换为:我要学编程

package RegexDemo;

public class Demo4 {
    /*将字符串:我要学学编编编编程程程程程程
    替换为:我要学编程*/
    public static void main(String[] args) {
        String str = "我要学学编编编编程程程程程程";
        //(.)表示任意字符
        //\\1表示第一字符再次出现
        //+至少一次
        //$1表示把正则表达式中的第一个分组的内容,再拿出来用
        String s = str.replaceAll("(.)\\1+", "$1");
        System.out.println(s);
    }
}

2.非捕获分组

分组后不需要再用本组数据,仅仅是把数据括起来。
请添加图片描述

相关文章:

  • 【Day9】make/makeFile如何让项目构建自动化起飞
  • 神经网络|(十三)|SOM神经网络
  • CSS 中等比例缩放的演变:从传统技巧到 aspect-ratio 属性
  • SpringBoot-模拟SSE对话交互
  • 全局异常处理器为什么不能处理过滤器异常,有那些解决方案
  • vxe-table开启表尾和el-collapse-transition不兼容,动画卡顿
  • 【Qt QML】Loader动态加载组件(续)
  • 《安富莱嵌入式周报》第351期:DIY半导体制造,工业设备抗干扰提升方法,NASA软件开发规范,小型LCD在线UI编辑器,开源USB PD电源,开源锂电池管理
  • Web后端开发-总结
  • 多线程-JUC源码
  • 利用opencv_python(pdf2image、poppler)将pdf每页转为图片
  • 2025年夸克网盘自动签到程序,验证通过!
  • android App主题颜色动态更换
  • IO进程线程3
  • 【AD】5-3 PCB板框的内缩与外扩
  • OpenBMC:BmcWeb app获取socket
  • 嵌入式 ARM Linux 系统构成(1):Bootloader层
  • oracle通过dmp导入数据
  • PHP之运算符
  • python-串口助手(OV7670图传)
  • 俄媒:俄乌代表团抵达谈判会场
  • 【社论】城市更新,始终以人为核心
  • 乌克兰官员与法德英美四国官员举行会谈
  • 高新波任西安电子科技大学校长
  • 国家统计局向多省份反馈统计督察意见
  • 武大校长:人工智能不存在“过度使用”,武大不会缩减文科