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.mzph.cn/news/633916.shtml

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

相关文章

【数据结构】- 单链表

先创建好SList.c、Test.c两个源文件和SList.h一个头文件。 SList.c和Test.c一样 SList.h 文件 在SList.h加上 1.单链表打印 SList.h SList.c 思路: 逻辑图(之后经常用到): 物理图: 为了方便运行Test.c中的运行还要在…

链表中倒数最后k个结点

链表中倒数最后k个结点 链表中倒数最后k个结点_牛客题霸_牛客网输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。。题目来自【牛客题霸】https://www.nowcoder.com/practice/886370fe658f41b498d40fb34ae76ff9 描述 输…

RNN:Recurrent Neural Network(上)

目录 1 为什么提出 RNN 1.1 什么是 Slot Filling 1.2 为什么 FFN 做不好 Slot Filling 1.3 为什么 RNN 能做好 Slot Filling 2 RNN 的整体结构 3 更高级的 RNN 结构 3.1 Deep RNN 3.2 Elman Network & Jordan Network 3.3 Bidirectional RNN 原视频&…

怎么样的布局是符合可制造性的PCB布局?

满足可制造性、可装配性、可维修性要求,方便调试的时候于检测和返修,能够方便的拆卸器件: 1)极性器件的方向不要超过2种,最好都进行统一方向等要求,如图1-1所示; 图1-1 极性器件方向统一摆放 2…

k8s的坑,从这里开始

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 以前刚接触k8s时踩了不少坑,比如这些: 问题1 1、在master节点使用kubectl命令时,报错&…

阿里云云原生弹性方案:用弹性解决集群资源利用率难题

作者:赫曦 随着上云的认知更加普遍,我们发现除了以往占大部分的互联网类型的客户,一些传统的企业,一些制造类的和工业型企业客户也都开始使用云原生的方式去做 IT 架构的转型,提高集群资源使用率也成为企业上云的一致…

20. 从零用Rust编写正反向代理,四层反向代理stream(tcp与udp)实现

wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子 项目地址 gite: https:…

【算法】串联所有单词的子串【滑动窗口】

题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如,如果 words ["ab","cd","ef"], 那么 "abcd…

2024 前端高频面试题之 JS 篇

JS 篇(持续更新中) 1、什么是原型、原型链?2、什么是继承?说一说有哪些?继承组合的原理及优点?3、new 操作符具体干了什么?4、js 有哪些方法改变 this 指向?5、bind 有哪些实现的注意…

通过manifest清单导入项目到gitlab中

文章目录 说明使用manifest得要求Manifest 格式演示示例 说明 从gitlab 11.2引入此功能。 GitLab 允许根据manifest清单文件(如 Android 存储库使用的清单文件)导入所需的 Git 存储库。 使用manifest得要求 GitLab 必须对其数据库使用 PostgreSQL。至少…

最终Docker6:nacos集群部署

目录 mysql容器构建 1.进入soft 文件夹,创建mysql文件夹 2.进入conf文件夹 放入my.conf 配置文件 3.运行mysql容器 4.进入script文件夹 导入 sql文件 5.进入mysql 容器 并登录 6.创建nacos 数据库并使用,运行nacos.sql文件 7.授予用户所有权限 部…

解析Linux中的VFS文件系统机制(根文件系统的由来)以及 ARM Linux启动流程-根文件系统的加载

《解析Linux中的VFS文件系统机制(根文件系统的由来)》 以及 《ARM Linux启动流程-根文件系统的加载》两篇文章都是好文章,但是第一篇缺少了rootfs的由来,让人觉得不能融会贯通,缺点火候。 第一篇文章:试图…

深入理解MyBatis中的#{ }和${ }占位符及参数传递过程

深入理解MyBatis中的#{ }和${ }占位符及参数传递过程 MyBatis是一个广泛使用的持久层框架,它以其强大的数据库访问能力和灵活的SQL映射配置而著称。在MyBatis中,#{ } 和 ${ } 是两种常用的占位符,用于构建动态的SQL语句。本文将深入研究这两种…

扭蛋机小程序搭建:互联网时代下的“潮玩经济”

近几年,潮玩文化逐渐兴起,盲盒经济闯入了各个消费者的视野中。扭蛋机不同于盲盒,包含的产品多数来自于各类热门动漫IP等,这些产品被装进一个扭蛋中,大众根据概率获得不一样的产品。扭蛋机具有产品多样、好玩不贵的特点…

【Git】实习使用记录

Git 高频命令、版本回退、分支操作、文件修改删除、撤销、标签、远程仓库推送、拉取 https://blog.csdn.net/wohu1104/article/details/105601657 浏览器可以访问github仓库,但是使用git就用不了 https://blog.csdn.net/m0_63230155/article/details/132070860 可…

Vscode安装Eslint扩展后无法实现保存自动修复

前言: 一个现有项目引入eslint时,vscode的eslint扩展会报很多错,通过打开eslint的autoFixOnSave配置自动修复。 从2.0.4版本开始,eslint扩展就移除了autoFixOnSave配置项。因为保存自动修复成为了vscode的Code Action on Save的一…

基于FPGA的图像双边滤波实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 双边滤波数学模型 4.2 双边滤波的特性 4.3 FPGA实现架构 5.算法完整程序工程 1.算法运行效果图预览 将FPGA数据导入到matlab对比测试: 2.算法运行软件版本 vivado2019.2 …

c# 自定义 滑块TrackBar

辛苦半天做出来的,如果觉得好用,记得点赞 效果图如下: 具体操作: 1 、添加代码(代码在下面),重新生成下整个工程,在工具栏中就出现控件,将控件拖到窗体中 2、只需要调整…

使用人工智能助手 Github Copilot 进行编程 01

本章涵盖了 AI 助⼿如何改变新程序员的学习⽅式为什么编程永远不会再⼀样了AI 助⼿如 Copilot 的⼯作原理Copilot 如何解决⼊⻔级编程问题AI 辅助编程的潜在危险 在本章中,我们将讨论人类如何与计算机进行交流。我们将向您介绍您的 AI 助手 GitHub Copilot&#x…

dp专题15 零钱兑换

本题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目: 思路: 这道题,是个比较模板的完全背包问题,这里要求的是问凑成总金额所需的最少的硬币的个数。 我们明确一下 dp[ …