JAVA正则表达式第二个作用:爬取

目录

本地数据爬取:

本地爬取练习:

网络爬取:

      -----  以下为均本地数据爬取:

带条件爬取

贪婪爬取和非贪婪爬取:

例题 1:使获取 1 为不贪婪

*例题 2:使获取 0、1 都为不贪婪


之前介绍了正则表达式的语法 和 第一个作用(校验字符串)

本地数据爬取:

目的:获取满足正则表达式规则的所有字符串

先来认识几个名词:

Pattern:表示正则表达式

Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取

本地爬取代码示例:

/* 有如下文本,请按照要求爬取数据。
Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,
因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
要求:找出里面所有的JavaXX*/
String str="Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这" +
"两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//1.创建正则表达式的对象
Pattern p=Pattern.compile("Java\\d{0,2}");//2.获取文本匹配器的对象
//m:文本匹配器的对象
//str:大串
//p:规则
//m要在str中找符合p规则的小串,
Matcher m = p.matcher(str);//3.循环
//拿着文本匹配器从头开始读取,寻找是否有满足规则的子串
//如果没有,方法返回false
//如果有,返回true。在底层记录子串的起始索引和结束索引+1,
//0,4
while(m.find()){String s=m.group();sout(s);
}
//方法底层会根据find方法记录的索引进行字符串的截取
//substring(起始索引,结束索引);包头不包尾
//(0,4)但是不包含4索引
//会把截取的小串进行返回。

本地爬取练习:

需求:把下面文本中的座机电话,邮箱,手机号,热线都爬取出来。

手机号的正则表达式:1[3-9]\d{9}

邮箱的正则表达式:\w+@[\w&&[^_]]{2,6}(\.[a-zA-Z]{2,3}){1,2}

座机电话的正则表达式:0\d{2,3}-?[1-9]\d{4,9}

热线电话的正则表达式:400-?[1-9]\\d{2}-?[1-9]\\d{3}

package pachong;import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexDemo8 {public static void main(String[] args) {String s = "电话:18512516758,18512508907"+"或者联系邮箱:boniu@itcast.cn," +"座机电话:01036517895,010-12345678" +"邮箱:bozai@itcast.cn," +"热线电话:400-618-9090,400-618-4000,4006184000,4006189090";String regex = "(1[3-9]\\d{9})|(\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2})"+"|(0\\d{2,3}-?[1-9]\\d{4,9})"+"|(400-?[1-9]\\d{2}-?[1-9]\\d{3})";//1.获取正则表达式的对象Pattern p = Pattern.compile(regex);//2.获取文本匹配器的对象
//利用m去读取s,会按照p的规则找里面的小串Matcher m = p.matcher(s);
//3.利用循环获取每一个数据while(m.find()){String str = m.group();System.out.println(str);}}
}


网络爬取:

网络爬虫暂时混个眼熟:

需求:

把该链接

:悬赏通缉嫌疑人,30名在逃盗抢骗嫌疑人个人资料正脸照曝光(2)_社会新闻_海峡网中所有的身份证号码都爬取出来。

(学习需求)

代码示例:

public class Test02 {public static void main(String[] args) throws IOException {//1.创建一个URL对象
URL url = new URL("http://www.hxnews.com/news/gn/shxw/201811/01/1641427_2.shtml");//2.连接上这个网络:保证网络是畅通的
URLConnection conn = url.openConnection();//读取网络数据:将连接转换为输入流,并通过BufferedReader来逐行读取网络返回的数据。
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
//获取正则表达式规则:调用静态方法getRole()获取预先定义好的正则表达式字符串,这个例子中的正则表达式用于匹配中国大陆的严格格式身份证号。
String regex = getRole();
Pattern p = Pattern.compile(regex);//数据处理和匹配:遍历BufferedReader读取的每一行数据,
// 对每行使用Pattern对象的matcher()方法生成Matcher对象,
// 然后通过Matcher对象的find()方法查找与正则表达式匹配的子串。
// 若找到匹配项,则调用group()方法打印出匹配的字符串。
while ((line = br.readLine()) != null) {//m会在line中找符合p规则的小串Matcher m = p.matcher(line);while(m.find()){System.out.println(m.group());}
}
//关闭资源:在所有数据处理完成后,关闭BufferedReader以释放系统资源。
br.close();
}//获取规则public static String getRole() {//严格的身份证;return "[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]";}
}


      -----  以下为均本地数据爬取:

带条件爬取

看下面例题:

文本:

"Windows XP:发布于2001年,Windows Vista:发布于2006年,Windows 7:发布于2009年, Windows 8:发布于2012年,Windows 10:发布于2015年,Windows 11:发布于2021年"

  • 需求1:爬取版本号为Vista、7、8、10、11的Windows文本,(但是只要Windows,不显示版本号)。
  • 需求2:爬取版本号为的Vista、7、8、10、11的Windows文本。正确爬取结果为:Windows Vista Windows 7 Windows 8 Windows 10 Windows 11
  • 需求3:爬取除了版本号为Vista、7、8、10、11的Windows文本,

// 注意:空格

public class Test04_Required02 {public static void main(String[] args) {String s=" Windows XP:发布于2001年,Windows Vista:发布于2006年,Windows 7:发布于2009年," +
" Windows 8:发布于2012年,Windows 10:发布于2015年,Windows 11:发布于2021年";//1
String regex1="Windows\\s(?=Vista|7|8|10|11)";// \\s表示空白字符
Pattern p1=Pattern.compile(regex1);
Matcher m = p1.matcher(s);
while(m.find()){System.out.println(m.group());
}//2
String regex2="Windows\\s(?:Vista|7|8|10|11)";//?:可省略
Pattern p2=Pattern.compile(regex2);
Matcher m2 = p2.matcher(s);while(m2.find()){System.out.println(m2.group());
}//3:注意
String regex3="Windows\\s(?!Vista|7|8|10|11)\\w+";
Pattern p3=Pattern.compile(regex3);
Matcher m3 = p3.matcher(s);while(m3.find()){System.out.println(m3.group());
}}
}

控制台:

Windows

Windows

Windows

Windows

Windows

Windows Vista

Windows 7

Windows 8

Windows 10

Windows 11

Windows XP

非捕获分组:正则表达式分组括号中介绍


贪婪爬取和非贪婪爬取:

注意:正则表达式规则中的量词才会有贪婪和非贪婪的区别(因为 字符类和与字符类只能匹配单个字符,也就没有贪婪和非贪婪之分)

正则表达式规则中的量词:才会有贪婪和非贪婪的区别。这些量词决定了其前面的表达式匹配字符的次数。

贪婪:它会尽可能多地匹配所涵盖的字符。(默认就是贪婪)

非贪婪:在量词后加上 ? 可以使其变为非贪婪,它会尽可能少地匹配所涵盖的字符。

例如,对于表达式"ab+":

"ab+"将会贪婪地匹配尽可能多的b,即匹配连续出现的b。

贪婪爬取获取结果:abbbbbbbbbbbb

"ab+?"将会非贪婪地匹配尽可能少的b,即只匹配一个b。

非贪婪爬取获取结果:ab

例题 1:使获取 1 为不贪婪

String s = "Java自从95年问世以来,011111" +
"经历了很多版木,目前企业中用的最多的是]ava8和]ava11,因为这两个是长期支持版木。" +
"下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";String regex="01+?";Pattern p=Pattern.compile(regex);
Matcher m= p.matcher(s);while(m.find()){System.out.println(m.group());
}

控制台:

01

*例题 2:使获取 0、1 都为不贪婪

String s = "Java自从95年问世以来,0000011111" +
"经历了很多版木,目前企业中用的最多的是]ava8和]ava11,因为这两个是长期支持版木。" +
"下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";String regex="0{1}1+?";Pattern p=Pattern.compile(regex);
Matcher m= p.matcher(s);while(m.find()){System.out.println(m.group());
}

控制台:

01

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/416130.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka 的 Consumer Group 解读

作为一份笔记,本文再次梳理一下 Kafka 的 Consumer Group。我们知道,一个 Topic 往往会有多个 Partition,一条消息只会被写到一个 Kafka 的 Partition 中,那 Consumer 是怎么消费 Message 的呢? Consumer Group 又从中…

MySQL复合查询解析

🎈行百里者半九十🎈 🎈目录🎈 概念多表查询自连接子查询单行子查询多行子查询in关键字all关键字any关键字 多列子查询在from中使用子查询合并查询unionunion all 总结 概念 之前我们很多的查询都只是对于单表进行查询&#xff0c…

Sqoop故障排除指南:处理错误和问题

故障排除是每位数据工程师和分析师在使用Sqoop进行数据传输时都可能遇到的关键任务。Sqoop是一个功能强大的工具,但在实际使用中可能会出现各种错误和问题。本文将提供一个详尽的Sqoop故障排除指南,涵盖常见错误、问题和解决方法,并提供丰富的…

RabbitMQ的基本使用,进行实例案例的消息队列

目录 一、介绍 1. 概述 2. 作用 3. 工作原理 二、RabbitMQ安装部署 1. 安装 2. 部署 3. 增加用户 三、实现案例 1. 项目创建 2. 项目配置 3. 生产者代码 4. 消费者代码 四、测试 每篇一获 一、介绍 1. 概述 RabbitMQ 是一种开源的消息代理和队列服务器&#x…

Logistic回归实战

一、题目 假设你是一所大学的行政管理人员,你想根据两门考试的结果,来决定每个申请人是否被录取。你有以前申请人的历史数据,可以将其用作逻辑回归训练集。对于每一个训练样本,你有申请人两次测评的分数以及录取的结果。为了完成这…

测试基础-软件测试必备知识总结

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 什么是软件测试? 软件测试是在软件产品发布之前检查其质量、功能和性能的过程。为了…

【论文阅读】GPT4Graph: Can Large Language Models Understand Graph Structured Data?

文章目录 0、基本介绍1、研究动机2、准备2.1、图挖掘任务2.2、图描述语言(GDL) 3、使用LLM进行图理解流程3.1、手动提示3.2、自提示 4、图理解基准4.1、结构理解任务4.1、语义理解任务 5、数据搜集5.1、结构理解任务5.2、语义理解任务 6、实验6.1、实验设…

基于SpringBoot Vue自习室管理系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

解决Qt的release构建下无法进入断点调试的问题

在工作的时候遇到了第三方库只提供release版本的库的情况,我需要在这基础上封装一层自家库,在调试的时候遇到如下问题,但是在Qt环境下,release的库只能在进行release构建和调试。 卡在了一直进不了断点的情况。提示内容如下&#…

2024-01-17(SpringCloud)

1.使用openFeign的itemClient接口去做远程调用其他微服务中的接口。但我们直接使用了itemClient接口,而不是该接口的实现类,说明我们是使用该接口的代理对象帮我们做远程调用的。这个代理对象是invocationHandler来生成的。 2.openFeign底层发起远程调用…

解决js计算精度问题

问题 浮点数,常用的办法是四舍五入保留2位小数来解决。但是在向上、向下保留小数的时候,比如:0.10.20.30000000000000004,向上保留2位小数就变成了0.31。 大整数,在超出Number的最大安全整数时,计算也会存…

Tide Quencher 8WS-Amine,TQ8WS-胺,可用于特定荧光信号的检测

您好,欢迎来到新研之家 文章关键词:Tide Quencher 8WS Amine,TQ8WS amine,Tide Quencher 8WS NH2 ,TQ8WS NH2,Tide Quencher 8WS 胺,TQ8WS 胺 一、基本信息 产品简介:The fluores…