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

news2024/11/13 23:21:23

目录

本地数据爬取:

本地爬取练习:

网络爬取:

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

带条件爬取

贪婪爬取和非贪婪爬取:

例题 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.coloradmin.cn/o/1398195.html

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

相关文章

mp4文件可以转成mp3音频吗

现在是个非常流行刷短视频一个年代,刷短视似乎成了人们休闲娱乐的一种方式,在日常刷短视频过程中,肯定会有很多同学被短视频 bgm 神曲洗脑,比如很多被网红翻唱带火的歌曲,例如其中"不负人间”,就是其中…

从零开始,自己搭建一个autonomous mobile robot做gazebo仿真(1):mobile robot建模与添加差速控制器

这样一个简单的mobile robot模型 首先写xacro文件&#xff0c;创建 link joint transmission <?xml version"1.0"?> <robot xmlns:xacro"http://www.ros.org/wiki/xacro" name"whill_modelc" ><xacro:property name"PI&q…

Unity导出Android项目踩坑记录

导出的时候需要注意以下地方的配置&#xff1a; 1、buildSetting-> 设置ExportProject 2、buildsetting ->playerSetting ->设置IL2CPP 3、设置ndk edit->preferences->external tools->ndk 如果unity的ndk版本和android项目里的ndk版本不一致会报错&…

尝试着在Stable Diffusion里边使用SadTalker进行数字人制作

首先需要标明的是&#xff0c;我这里是图片说话类型&#xff0c;而且是看了知识星球AI破局俱乐部大航海数字人手册进行操作的。写下这篇文章是防止我以后遗忘。 我使用的基础软件是Stable Diffusion&#xff0c;SadTalker是作为插件放进来的&#xff0c;需要注意的是这对自己的…

Swagger + Knife4j 接口文档的整合

Swagger 接口文档的整合&#xff1a; 引入依赖&#xff08;Swagger 或 Knife4j&#xff09;。自定义 Swagger 配置类。定义需要生成接口文档的代码位置&#xff08;Controller&#xff09;。注意&#xff1a;线上环境不要把接口暴露出去&#xff01;&#xff01;&#xff01;可…

统计学-R语言-6.1

文章目录 前言参数估计的原理总体、样本和统计量点估计区间估计评价估计量的标准有效性 总体均值的区间估计一个总体均值的估计&#xff08;大样本&#xff09;一个总体均值的估计&#xff08;小样本估计&#xff09; 练习 前言 本篇文章将开始介绍参数估计的相关知识。 参数估…

【超实用】用Python语言实现定时任务的八个方法,建议收藏!

在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现。另外一种方式是直接使用Python。接下来整理的是常见的Python定时任务的八种实现方式。 利用while True: + sleep()实现定时任务 位于 time 模块中的 sleep(secs) 函…

【ARM Cortex-M 系列 1.1 -- Cortex-M33 与 M4 差异 详细介绍】

请阅读【嵌入式开发学习必备专栏 之 Cortex-Mx 专栏】 文章目录 背景Cortex-M33 与 M4 差异Cortex-M33Cortex-M4关系和差异举例说明 背景 在移植 RT-Thread 到 瑞萨RA4M2&#xff08;Cortex-M33&#xff09;上时&#xff0c;遇到了hardfault 问题&#xff0c;最后使用了Cortex…

物理层网路设备

目录 一、物理层网络设备-中继器 二、物理层网络设备-集线器 三、在物理层扩展局域网 一、物理层网络设备-中继器 中继器的介绍&#xff1a; 线路上传输的信号功率由于存在损耗会逐渐衰减&#xff0c;衰减到一定程度时信号失真会导致接收错误。中继器就是为解决这一问题而…

小埋公司的IPO方案的题解

目录 原题描述&#xff1a; 题目描述 输入格式 输出格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 题目大意&#xff1a; 主要思路&#xff1a; 但是but 代码code&#xff1a; 时间限制: 500ms 空间限制: 65536kB 原题…

Wayfair 开启2024年的裁员模式

周五的时候 Wayfair 的 CEO 公开信中表示&#xff0c;将削减 1650 个工作岗位。 通篇读下来的意思就是公司目前还是非常健康的状态&#xff0c;新冠导致的在线购物激增让 Wayfair 在短时间内的销售从 90 亿美元增加到 180 亿美元。 几乎是翻倍了&#xff0c;而且这个让 Wayfai…

Unity vs Godot :哪个游戏引擎更适合你?

Unity vs Godot &#xff1a;哪个游戏引擎更适合你&#xff1f; 游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来&#xff0c;Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较&#xff0c;以期为开发者提供正确的选择建议。 Godot和Unity都有…

[Error]连接iPhone调试时提示Failed to prepare the device for development.

环境&#xff1a; iPhone 7 Plus iOS 15.8 Xcode14.2 问题&#xff1a; 连接iPhone设备运行时&#xff0c;设备旁提示如下文案。 Failed to prepare the device for development. 这时强行点击运行按钮&#xff0c;会弹窗提示如下文案。 The run destination ZDMiPhone is n…

分类预测 | Matlab实现WOA(海象)-XGboost分类【24年新算法】基于海象优化算法(WOA)优化XGBoost的数据分类预测

分类预测 | Matlab实现WOA(海象)-XGboost分类【24年新算法】基于海象优化算法(WOA)优化XGBoost的数据分类预测 目录 分类预测 | Matlab实现WOA(海象)-XGboost分类【24年新算法】基于海象优化算法(WOA)优化XGBoost的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本…

第一篇【传奇开心果系列】beeware开发移动应用:轮盘抽奖移动应用

系列博文目录 beeware开发移动应用示例系列博文目录一、项目目标二、开发传奇开心果轮盘抽奖安卓应用编程思路三、传奇开心果轮盘抽奖安卓应用示例代码四、补充抽奖逻辑实现五、开发传奇开心果轮盘抽奖苹果手机应用编程思路六、开发传奇开心果轮盘抽奖苹果手机应用示例代码七、…

B站提示:“当前浏览器版本较低……”可行的解决方案(edge浏览器)

文章目录 问题研究和分析使用User-Agent Switcher for Chrome插件的解决方法使用userAgent switcher的解决方法 问题研究和分析 问题&#xff1a;使用最新版浏览器访问B站&#xff0c;首页总是有一条横幅提示&#xff1a;当前浏览器版本较低&#xff0c;为保证您的使用体验&am…

怎么用小程序将身份证转为结构化Excel?

随着科技的不断发展&#xff0c;我们的生活变得越来越智能化。现在&#xff0c;我们可以使用金鸣表格文字识别小程序来识别身份证并转为结构化的excel&#xff0c;并且可自动核对真伪&#xff0c;保留头像。金鸣表格文字识别小程序是一种基于人工智能技术的应用程序&#xff0c…

全开源多城市同城信息小程序源码(Laravel 框架),同城分类信息发布便民小程序系统【非DZ】

同城生活分类信息小程序&#xff0c;人才招聘、房产二手 多城市地区同城分类信息发布&#xff0c;商家入驻等功能 小程序前后端代码开源无加密&#xff0c;可进行二次开发 【源码运行要求】 1、需要已认证的微信小程序 2、已备案的域名及服务器空间 推荐使用宝塔面板LinuxPHP…

五、模 板

1 泛型编程 以往我们想实现一个通用的交换函数&#xff0c;可能是通过下面的方式来实现的&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left ri…

luffy商城项目(一)

企业项目类型 # 1 面向互联网用户&#xff1a;商城类项目 -微信小程序商城 # 2 面向互联网用户&#xff1a;二手交易类的 -咸鱼 -转转 # 3 公司内部项目&#xff1a;python写的重点 -oa系统 -打卡系统工资核算系统 -第三方公司做的&#xff1a…