JAVA学习第十三章——常用API(四【爬虫】)

本地爬虫

    public static void main(String[] args) {
        String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
                "因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
        
        //1.获取正则表达式
        Pattern p = Pattern.compile("Java\\d{0,2}");
        //2.获取文本匹配器的对象
        Matcher m = p.matcher(str);
        //3.利用循环获取
        while (m.find()){
            String s = m.group();
            System.out.println(s);
        }

有条件的爬取

有如下文本,请按照要求爬取数据:
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.定义正则表达式
        String regex = "Java(?=8|11|17)";
        
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while (m.find()){
            System.out.println(m.group());
        }

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

        //1.定义正则表达式
        String regex = "Java(?:8|11|17)";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while (m.find()){
            System.out.println(m.group());
        }

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

        //1.定义正则表达式
        String regex = "Java(?!8|11|17)";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while (m.find()){
            System.out.println(m.group());
        }

    }
需求3

贪婪爬取和非贪婪爬取

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

需求1:按照ab+的方式爬取ab,b尽可能多获取
需求2:按照ab+的方式爬取ab,b尽可能少获取

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

        //1.定义正则表达式
        String regex = "ab+";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while (m.find()){
            System.out.println(m.group());
        }

    }
贪婪爬取
    public static void main(String[] args) {
        String str = "Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa" +
                "经历了很多版本,目前企业中用的最多的是Java8和Java11," +
                "因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";

        //1.定义正则表达式
        String regex = "ab+?";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while (m.find()){
            System.out.println(m.group());
        }

    }
非贪婪爬取

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

方法名说明
public String[] matches(String regex)判断字符串是否满足正则表达式的规则
public String replaceAll(String regex,String newStr)按照正则表达式的规则进行替换
public String[] split(String regex)按照正则表达式的规则切割字符串

有一段字符串:小诗诗qwasdasdaskj465465a小丹丹askjdbnaksjbdaskj654小灰灰

要求1:把字符串中三个姓名之间的字母替换为vs
要求2:把字符串中的三个姓名切割出来

    public static void main(String[] args) {
        String s = "小诗诗qwasdasdaskj465465a小丹丹askjdbnaksjbdaskj654小灰灰";

        String result = s.replaceAll("[\\w&&[^_]]+", "vs");
        System.out.println(result);

    }
需求1
    public static void main(String[] args) {
        String s = "小诗诗qwasdasdaskj465465a小丹丹askjdbnaksjbdaskj654小灰灰";

        String[] arr = s.split("[\\w&&[^_]]+");

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        
    }
需求2

分组练习

需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
举例:a123a b456b 17891 &abc& a123b(false)

    public static void main(String[] args) {
        // \\组号:表示把第x组的内容拿出来用一次
        //a123a b456b 17891 &abc& a123b(false)
        String regex = "(.).+\\1";
        System.out.println("a123a".matches(regex));
        System.out.println("b456b".matches(regex));
        System.out.println("17891".matches(regex));
        System.out.println("&abc&".matches(regex));
        System.out.println("a123b".matches(regex));
    }

需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
举例:abc123abc b456b 123789123 &!@abc&!@ abc123abd(false)

    public static void main(String[] args) {
        // \\组号:表示把第x组的内容拿出来用一次
        //abc123abc b456b 123789123   &!@abc&!@   abc123abd(false)
        String regex = "(.+).+\\1";
        System.out.println("abc123abc".matches(regex));
        System.out.println("b456b".matches(regex));
        System.out.println("123789123".matches(regex));
        System.out.println("&!@abc&!@".matches(regex));
        System.out.println("abc123abd".matches(regex));
    }

需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致
举例:aaa123aaa bbb456bbb 111789111 &&abc&& aaa123aab

    public static void main(String[] args) {
        //aaa123aaa bbb456bbb 111789111 &&abc&& aaa123aab
        //(.):把首字母看做一组
        //\\2:把首字母拿出来再次使用
        //*:作用于\\2,表示后面重复的内容出现0次或多次
        String regex = "((.)\\2*).+\\1";
        System.out.println("aaa123aaa".matches(regex));
        System.out.println("bbb456bbb".matches(regex));
        System.out.println("111789111".matches(regex));
        System.out.println("&&abc&&".matches(regex));
        System.out.println("aaa123aab".matches(regex));
    }

口吃替换

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

    public static void main(String[] args) {
/*        需求:
        将字符串:我要学学编编编编编编编编编编程程程程程程程程程程程程程程
        替换为:我要学编程*/
        String str = "我要学学编编编编编编编编编编程程程程程程程程程程程程程程";

        //(.):表示把重复内容的第一个字符看做一组
        //\\1:表示第一字符再次出现
        //+:至少一次
        //$1:表示把正则表达式中第一组的内容,再拿出来用
        String s = str.replaceAll("(.)\\1+", "$1");
        System.out.println(s);
    }

捕获分组
正则内部使用:\ \组号
正则外部使用:$组号
符号含义举例
非捕获分组
(?:正则)获取所有Java(? : 8 I 11 I 17)
(?= 正则)获取前面部分Java(? = 8 I 11 I 17)
(?!正则)获取不是指定内容的前面部分Java(? ! 8 I 11 I 17)

Tips

以上学习内容均来自于B站黑马程序员

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值