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

Java----用正则表达式爬取数据

爬虫,也称为网络爬虫(Web Crawler)或网络蜘蛛(Web Spider),是一种按照一定规则,自动抓取万维网信息的程序或脚本。它通过模拟人类在浏览器中的操作,访问网页并解析其中的内容,将有用的数据提取出来。

 

Pattern.compile()方法属于java.util.regex.Pattern类,其主要功能是将一个正则表达式字符串编译成Pattern对象。编译后的Pattern对象可用于创建Matcher对象,进而执行匹配操作。将正则表达式编译为Pattern对象这一步骤并非必需,但如果需要多次使用同一个正则表达式进行匹配,提前编译可以显著提高性能,因为编译过程相对耗时。

import java.util.regex.Pattern;

public class PatternCompileExample {
    public static void main(String[] args) {
        // 编译正则表达式,匹配连续的数字
        Pattern pattern = Pattern.compile("\\d+");
        System.out.println("正则表达式已编译为Pattern对象");
    }
}

在上述代码中,Pattern.compile("\\d+")将正则表达式\\d+(用于匹配一个或多个连续数字)编译成了Pattern对象,后续就可以利用这个对象进行相关匹配操作。

Matcher.group()方法是Matcher类中的重要方法,用于获取匹配到的子字符串。它可以有两种使用方式:不带参数和带参数。不带参数时,返回上一次匹配操作所匹配到的整个字符串;带参数时,参数代表捕获组的编号,返回对应捕获组匹配到的子字符串。捕获组是通过在正则表达式中使用括号()定义的,捕获组编号从 1 开始,group(0)等同于无参数的group(),表示整个匹配的字符串。

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.lang.Math.abs;
import static java.lang.Math.random;

    public class Test3 {
        public  static void main(String[] args) {
            //1.获取正则表达式的对象
            //2.获取文本匹配器的对象
            //拿着m去读取str,找符合p规则的字串
            String s="来黑马程序员学习Java,\n" +
                    "电话:18512516758,18512508907\n" +
                    "或者联系邮箱:boniu@itcast.cn,\n" +
                    "座机电话:01036517895,010-98951256\n" +
                    "邮箱:bozai@itcast.cn,\n" +
                    "热线电话:400-618-9090,400-618-4000,4006184000,4006189090";
//            String regex1 = "400-?[1-9]//d{2}-[1-9]//d{3}";
//            String regex2 = "0\\d{2,3}-?[1-9]\\d{4,9}";
//            String regex3 = "1[3-9]\\d{9}";
//            String regex4 = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
            String regex = "(400-?[1-9]//d{2}-[1-9]//d{3})|" +
                    "(0\\d{2,3}-?[1-9]\\d{4,9})|" +
                    "(1[3-9]\\d{9})|(\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2})";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(s);
            while (m.find()){
                String s1 = m.group();
                System.out.println(s1);
            }


        }

    }

Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17


需求:爬取版本号为8,11,17的Java文本,但是只要Java,不显示版本号。
 

1.定义正则表达式
?理解为前面的数据Java
=表示在JaVa后面要跟随的数据
但是在获取的时候,只获取前半部分

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.lang.Math.abs;
import static java.lang.Math.random;

    public class Test3 {
        public  static void main(String[] args) {
            //1.获取正则表达式的对象
            //2.获取文本匹配器的对象
            //拿着m去读取str,找符合p规则的字串
            String s="Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
                    "因为这两个是长期支持版本,下一个长期支持版本是Java17";
//            String regex1 = "400-?[1-9]//d{2}-[1-9]//d{3}";
//            String regex2 = "0\\d{2,3}-?[1-9]\\d{4,9}";
//            String regex3 = "1[3-9]\\d{9}";
//            String regex4 = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
            String regex = "Java(?=8|11|17)";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(s);
            while (m.find()){
                String s1 = m.group();
                System.out.println(s1);
            }


        }

    }

贪婪爬取:

贪婪爬取是正则表达式的默认匹配模式。在这种模式下,正则表达式会从字符串的起始位置开始,尽可能多地匹配符合模式的字符,直到无法再匹配为止。例如,对于正则表达式a.*b,它会在字符串中寻找以a开头、以b结尾的最长子串。(经可能多的爬取)

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.lang.Math.abs;
import static java.lang.Math.random;

    public class Test3 {
        public  static void main(String[] args) {
            //1.获取正则表达式的对象
            //2.获取文本匹配器的对象
            //拿着m去读取str,找符合p规则的字串
            String s="Java自从95年问世以来,abbbbbbbbbbbbbbbbbbbbaaaaaaaaaaa经历了很多版本,目前企业中用的最多的是Java8和Java11," +
                    "因为这两个是长期支持版本,下一个长期支持版本是Java17";
            String regex = "ab+";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(s);
            while (m.find()){
                String s1 = m.group();
                System.out.println(s1);
            }


        }

    }

非贪婪爬取:

非贪婪爬取,也称为懒惰匹配,与贪婪爬取相反。在这种模式下,正则表达式会从字符串的起始位置开始,尽可能少地匹配符合模式的字符,一旦找到一个能满足匹配条件的最小子串,就停止匹配。在正则表达式中,通过在量词(如*、+、?)后面加上?来实现非贪婪匹配。例如,a.*?b表示匹配以a开头、以b结尾的最短子串。(尽可能少的爬取)

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.lang.Math.abs;
import static java.lang.Math.random;

    public class Test3 {
        public  static void main(String[] args) {
            //1.获取正则表达式的对象
            //2.获取文本匹配器的对象
            //拿着m去读取str,找符合p规则的字串
            String s="Java自从95年问世以来,abbbbbbbbbbbbbbbbbbbbaaaaaaaaaaa经历了很多版本,目前企业中用的最多的是Java8和Java11," +
                    "因为这两个是长期支持版本,下一个长期支持版本是Java17";
            String regex = "ab+?";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(s);
            while (m.find()){
                String s1 = m.group();
                System.out.println(s1);
            }


        }

    }


http://www.kler.cn/a/613631.html

相关文章:

  • SpringCloud Hystrix的用法详解
  • 【C#.NET】Web API项目Swagger配置扩展
  • vscode无法打开Terminal终端
  • 电脑连不上手机热点会出现的小bug
  • 博卡软件管理中心8:为美容美发行业量身打造的轻量级管理方案
  • swagger上传图片请求报错
  • 3.27学习总结
  • 介绍几种创意登录页(含完整源码)
  • Uniapp使用大疆SDK打包离线原生插件二
  • 力扣HOT100之普通数组:41. 缺失的第一个正数
  • uvm configuration
  • Starrocks架构及如何选择
  • 【Golang】第八弹----面向对象编程
  • Qt下载模板到本地文件内容丢失问题
  • 2025年最新自动化/控制保研夏令营预推免面试真题分享(东南大学苏州校区/华东理工/南航/天大)
  • Redis 中的过期策略和内存淘汰策略
  • 项目-苍穹外卖(十六) Apache ECharts+数据统计
  • Vue学习笔记集--pnpm包管理器
  • 企业高效访问海外SAAS应用,SD-WAN出口网络专线提高办公效率
  • 蓝桥杯备考:DFS之数独