【Java学习笔记】

API


爬虫

练习

本地爬虫和网络爬虫

(1)本地爬虫

有如下文本,请按照要求爬取数据。

Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本时Java17,相信在未来不久Java17也会逐渐登上历史舞台

要求:找出里面所有的JavaXX

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexDemo04 {public static void main(String[] args) {/*有如下文本,请按照要求爬取数据。Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本时Java17,相信在未来不久Java17也会逐渐登上历史舞台要求:找出里面所有的JavaXX*/String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,"+"因为这两个是长期支持版本,下一个长期支持版本时Java17,相信在未来不久Java17也会逐渐登上历史舞台";//method1(str);//1.获取正则表达式的对象Pattern p = Pattern.compile("Java\\d{0,2}");//2.获取文本匹配器的对象//拿着m去读取str,找符合p规则的子串Matcher m = p.matcher(str);//3.利用循环获取while(m.find()) {String s = m.group();System.out.println(s);}}private static void method1(String str) {//Pattern:表示正则表达式//Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。//        在大串中去找符合规则的子串。//获取正则表达式的对象Pattern p = Pattern.compile("Java\\d{0,2}");//获取文本匹配器的对象//m:文本匹配器的对象//str:大串//p:规则//m要在str中找符合p规则的小串Matcher m = p.matcher(str);//拿着文本匹配器从头开始读取,寻找是否有满足规则的子串//如果没有,方法返回false//如果有,返回true。在底层记录字串的起始索引和结束索引+1//0,4boolean b = m.find();//方法底层会根据find方法记录的索引进行字符串的截取//subString(起始索引,结束索引);包头不包尾//(0,4)但是不包含4索引//会把截取的小串进行返回String s1 = m.group();System.out.println(s1);//Java//第二次在调用find的时候,会继续读取后面的内容//读取到第二个满足要求的子串,方法会继续返回true//并把第二个字串的起始索引和结束索引+1,进行记录b = m.find();//第二次调用group方法的时候,会根据find方法记录的索引再次截取子串String s2 = m.group();System.out.println(s2);}
}

(2)网络爬虫

public class RegexDemo05 {public static void main(String[] args) {/* 扩展需求2:把链接:https://m.sengzan.com/jiaoyu/29104.html?ivk_sa=1025883i中所有的身份证号码都爬取出来*///创建一个URL对象URL url = null;try {url = new URL("https://m.sengzan.com/jiaoyu/29104.html?ivk_sa=1025883i");} catch (MalformedURLException e) {throw new RuntimeException(e);}//连接上这个网址//细节:保证网络畅通URLConnection conn;try {conn = url.openConnection();} catch (IOException e) {throw new RuntimeException(e);}//创建一个对象去读取网络中的数据BufferedReader br;try {br = new BufferedReader(new InputStreamReader(conn.getInputStream()));} catch (IOException e) {throw new RuntimeException(e);}String line;//获取正则表达式的对象 patternString regex = "[1-9]\\d{17}";Pattern pattern = Pattern.compile(regex);//在读取的时候每次读一整行while (true) {try {if (!((line = br.readLine()) != null)) break;} catch (IOException e) {throw new RuntimeException(e);}//拿着文本匹配器的对象matcher按照pattern的规则去读取当前的这一行信息Matcher matcher = pattern.matcher(line);while(matcher.find()) {System.out.println(matcher.group());}}try {br.close();} catch (IOException e) {throw new RuntimeException(e);}}
}

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

来黑马程序员学习Java,

电话:18512516758,18512508907

或者联系邮箱:boniu@itcast.cn,

座机电话:01036517895,010-98951256

邮箱:bozai@itcast.cn,

热线电话:400-618-9090,400-618-4000,4006184000,4006189090

public class RegexDemo06 {public static void main(String[] args) {/* 需求:把下面文本中的电话,邮箱,手机号,热线都爬取出来。来黑马程序员学习Java,电话:18512516758,18512508907或者联系邮箱:boniu@itcast.cn,座机电话:01036517895,010-98951256邮箱:bozai@itcast.cn,热线电话:400-618-9090,400-618-4000,4006184000,4006189090手机号的正则表达式: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}*/String s = "来黑马程序员学习Java,"+"电话:18512516758,18512508907"+"或者联系邮箱:boniu@itcast.cn,"+"座机电话:01036517895,010-98951256"+"邮箱:bozai@itcast.cn,"+"热线电话:400-618-9090,400-618-4000,4006184000,4006189090";System.out.println("400-618-9090".matches("400-?[1-9]\\d{2}-?[1-9]\\d{3}"));//trueSystem.out.println("400-618-4000".matches("400-?[1-9]\\d{2}-?[1-9]\\d{3}"));//trueSystem.out.println("4006184000".matches("400-?[1-9]\\d{2}-?[1-9]\\d{3}"));//trueSystem.out.println("4006189090".matches("400-?[1-9]\\d{2}-?[1-9]\\d{3}"));//trueString 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);}}
}

(4)有条件的爬取数据

有如下文本,请按照要求爬取数据。

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 class RegexDemo07 {public static void main(String[] args) {/* 有如下文本,请按照要求爬取数据。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文本。*/String s = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本," +"下一个长期支持版本时Java17,相信在未来不久Java17也会逐渐登上历史舞台";//1.定义正则表达式//?理解为前面的数据Java//=表示在Java后面要跟随的数据//但是在获取的时候,只获取前半部分//需求1:String regex1 = "Java(?=8|11|17)";//需求2:String regex2 = "Java(8|11|17)";//String regex2 = "Java(?:8|11|17)";//需求3:String regex3 = "Java(?!8|11|17)";Pattern p = Pattern.compile(regex3);Matcher m = p.matcher(s);while(m.find()) {System.out.println(m.group());}}
}

(5)贪婪爬取和非贪婪爬取

有如下文本,请按照要求爬取数据。

Java自从95年问世以来,abbbbbbbbbbbaaaaaaaaaaaaaaaaa经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本时Java17,相信在未来不久Java17也会逐渐登上历史舞台

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

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

public class RegexDemo08 {public static void main(String[] args) {/* 有如下文本,请按照要求爬取数据。Java自从95年问世以来,abbbbbbbbbbbaaaaaaaaaaaaaaaaa经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本时Java17,相信在未来不久Java17也会逐渐登上历史舞台需求1:按照ab+的方式爬取ab,b尽可能多获取需求2:按照ab+的方式爬取ab,b尽可能少获取只写+和*表示贪婪匹配+? 非贪婪匹配*? 非贪婪匹配贪婪爬取:在爬取数据的时候尽可能多的获取数据非贪婪爬取:在爬取数据的时候尽可能少的获取数据ab+:贪婪爬取:abbbbbbbbbbb非贪婪爬取:abJava当中,默认的就是贪婪爬取如果我们在数量词+ * 的后面加上问号,那么此时就是非贪婪爬取*/String s = "Java自从95年问世以来,abbbbbbbbbbbaaaaaaaaaaaaaaaaa经历了很多版本," +"目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本," +"下一个长期支持版本时Java17,相信在未来不久Java17也会逐渐登上历史舞台";String regex = "ab+?";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(s);while(m.find()) {System.out.println(m.group());}}
}

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

方法名说明
public String[] matches(String regex)判断字符串是否满足正则表达式的规则
public String replaceAll(String regex,String newStr)按照正则表达式的规则进行替换
public String[] split(String regex)按照正则表达式的规则切割字符串
public class RegexDemo09 {public static void main(String[] args) {//public String replaceAll(String regex,String newStr)    按照正则表达式的规则进行替换//public String[] split(String regex)                     按照正则表达式的规则切割字符串/*有一段字符串:小诗诗djifndjniw34小丹丹sachbauqw87小惠惠要求1:把字符串中三个名字之间的字母替换为vs要求2:把字符串中的三个名字切割出来*/String s = "小诗诗djifndjniw34小丹丹sachbauqw87小惠惠";//细节://方法在底层跟之前一样也会创建文本解析器的对象//然后从头开始去读取字符串中的内容,只要有满足的的,那么就用第二个参数去替换//String result1 = s.replaceAll("[\\w&&[^_]]+", "vs");//System.out.println(result1);//小诗诗vs小丹丹vs小惠惠String[] arr = s.split("[\\w&&[^_]]+");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}

捕获分组和非捕获分组

分组

分组就是一个小括号

每组是有组号的,也就是序号。

规则1:从1开始,连续不间断。

规则2:以左括号为基准,最左边的是第一组,其次为第二组,以此类推。

练习

捕获分组的联系

捕获分组就是把这一组的数据捕获出来,再用一次。

需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符

举例:a123a b456b 17891 &abc&

需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符

举例:abc123abc b456b 123789123 &!@abc&!@

需求3:判断一个字符串的开始字符和结束字符是否一致?开始部分内部每个字符也需要一致

举例:aaa123aaa bbb456bbb 111789111 &&abc&&

public class RegexDemo10 {public static void main(String[] args) {/*需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符举例:a123a  b456b  17891  &abc&  a123b(false)需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符举例:abc123abc  b456b  123789123  &!@abc&!@  abc123abd(false)需求3:判断一个字符串的开始字符和结束字符是否一致?开始部分内部每个字符也需要一致举例:aaa123aaa  bbb456bbb  111789111  &&abc&&*///需求1://  \\组号:表示把第X组的内容再拿出来用一次String regex1 = "(.).+\\1";System.out.println("a123a".matches(regex1));System.out.println("b456b".matches(regex1));System.out.println("17891".matches(regex1));System.out.println("&abc&".matches(regex1));System.out.println("a123b".matches(regex1));System.out.println("---------------------");//需求2:String regex2 = "(.+).+\\1";System.out.println("abc123abc".matches(regex2));System.out.println("b456b".matches(regex2));System.out.println("123789123".matches(regex2));System.out.println("&!@abc&!@".matches(regex2));System.out.println("abc123abd".matches(regex2));System.out.println("---------------------");//需求3://(.):把首字母看作一组// \\2:把首字母拿出来再次使用// *:作用于\\2,表示后面重复的内容出现0次或多次String regex3 = "((.)\\2*).+\\1";System.out.println("aaa123aaa".matches(regex3));System.out.println("bbb456bbb".matches(regex3));System.out.println("111789111".matches(regex3));System.out.println("&&abc&&".matches(regex3));System.out.println("1a12".matches(regex3));System.out.println("---------------------");}
}

口吃替换

需求:

将字符串:我要学学编编编编程程程程程程

替换为:我要学编程

public class Regex11 {public static void main(String[] args) {/*将字符串:我要学学编编编编程程程程程程替换为:我要学编程*/String str = "我要学学编编编编程程程程程程";//需求:把重复的内容 替换为 单个的//学学       学//编编编编    编//程程程程程程 程//(.) 表示把重复内容的第一个字符看作一组// \\1表示第一组字符再次出现//+ 至少一次//$1 表示把正则表达式中第一组的内容,再拿出来用String result = str.replaceAll("(.)\\1+", "$1");System.out.println(result);}
}

总结:

捕获分组:后续还要继续使用本组的数据

正则内部使用:\\组号

正则外部使用:$组号

非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来。(不占用组号)

符号含义举例
(?:正则)获取所有Java(?:8|11|17)
(?= 正则)获取前面部分Java(?=8|11|17)
(?! 正则)获取不是指定内容的前面部分Java(?!8|11|17)

说明:

以上笔记学习是学习b站黑马程序员时记下的笔记,仅限于帮助理解学习,不做任何其他商业用途。

黑马程序员

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

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

相关文章

外星文明会是朋友还是敌人?科学家用AI模拟揭示惊人答案!

引言&#xff1a;人类与外星文明的潜在互动 自古以来&#xff0c;人类就对外太空充满了好奇与向往&#xff0c;无数科幻作品中都描绘了人类与外星文明的潜在互动。然而&#xff0c;这些互动并非总是和平友好的&#xff0c;正如物理学家Stephen Hawking所警告的&#xff0c;盲目…

K线实战分析系列之六:启明星——空方力量减弱信号

KK线实战分析系列之六&#xff1a;启明星——空方力量减弱信号 一、星线二、多种反转形态三、启明星形态四、启明星形态的总结 一、星线 星线在单根K线形态上是属于纺锤线&#xff0c;之所以被称为星线&#xff0c;主要是因为它在行情当中的相对位置&#xff0c;区别于其他纺锤…

Unity(第四部)新手组件

暴力解释就是官方给你的功能&#xff1b;作用的对象上面如&#xff1a; 创建一个球体&#xff0c;给这个球体加上重力 所有物体都是一个空物体&#xff0c;加上一些组件才形成了所需要的GameObject。 这是一个空物体&#xff0c;在Scene场景中没有任何外在表现&#xff0c;因为…

Java零基础 - 条件运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

测绘测量行业CRM功能大揭秘:哪家才是最佳选择?

测绘测量行业面临着处理及管理海量数据的难题。办公软件进行数据记录是非常繁琐的&#xff0c;往往需要花费大量的时间来查找所需的信息&#xff0c;甚至造成内容丢失。测绘测量企业运用CRM管理系统至关重要。本文将向您介绍测绘测量行业CRM功能、哪家好&#xff1f; CRM软件的…

typora + sm.ms +picgo 撰写博客,上传图片

时间&#xff1a;2024/2/22 参考链接&#xff1a; Typora PicGo SM.MS实现图片自动上传 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/256217410Molunerfinn_PicGops: 不稳定&#xff0c; 完了试试gitee 这个从上传图片改到复制到对应文件夹又好了&#xff0c;难崩 具…

【Python-语法】

Python-语法 ■ Python基础■ 数据类型■ 注释 单行注释&#xff0c;多行注释■ 编码方式 ■■■■■ ■ Python基础 ■ 数据类型 ■ 注释 单行注释&#xff0c;多行注释 ■ 编码方式 ■ ■ ■ ■ ■

在线程调用的函数中使用pthread_exit同样会将线程退出

如上图所示&#xff0c;在func()函数中调用pthread_exit&#xff0c;同样可以退出当前线程&#xff1b; 类似的&#xff0c;如果func&#xff08;&#xff09;函数中调用exit&#xff0c;可以直接退出整个进程。 return 是返回到函数调用处&#xff1b; pthread_exit是退出…

模型 HBG(品牌增长)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。品牌增长法。 1 HBG(品牌增长)模型的应用 1.1 江小白使用HBG模型提高品牌知名度和销售额 选择受众市场&#xff1a;江小白的目标客户是年轻人&#xff0c;他们喜欢简单、时尚的产品。因此&#xff0c;江…

【C++初阶】--类和对象(下)

目录 一.const成员 1.权限放大问题 2.权限的缩小 二.再谈构造函数 1.构造函数体赋值 2.初始化列表 (1)概念 (2)使用 ①在对象实例化过程中&#xff0c;成员变量先依次进行初始化 ②再进行函数体内二次赋值 3.explicit关键字 (1)C为什么要存在自动隐式类型转换…

从概念到实现:开发一款招聘APP的技术指南

如今&#xff0c;招聘APP作为连接求职者和招聘企业的重要工具&#xff0c;其功能和性能直接影响着用户体验和市场竞争力。本文将带领读者深入探讨从概念到实现的全过程&#xff0c;为开发一款优秀的招聘APP提供技术指南。 一、理解市场需求与用户行为 在开发招聘APP之前&#…

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高,Kotlin

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高&#xff0c;Kotlin 当一个图片放在ImageView里面后&#xff0c;用以下方式获取图的宽高&#xff1a; val bmp1 (this.drawable as BitmapDrawable).bitmapLog.d("fly", &…

C语言——实用调试技巧——第2篇——(第23篇)

坚持就是胜利 文章目录 一、实例二、如何写出好&#xff08;易于调试&#xff09;的代码1、优秀的代码2、示范&#xff08;1&#xff09;模拟 strcpy 函数方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;有弊端方法四&#xff1a;对方法三进行优化assert 的使用 方法五…

【C++STL】STL容器详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

VMware虚拟机从一台电脑复制到另一台电脑

1 概述 在一台电脑上利用虚拟机安装了OS系统&#xff0c;特别是如果虚拟机中的系统进行了各种繁琐的配置&#xff0c;因为换电脑或者需要在其他电脑上配置&#xff0c;这个时候就可以将虚拟机中的系统复制拷贝一份到新电脑上&#xff0c;省时省力。 2 操作步骤 2.1 vmx文件 …

Python学习 --- 面向对象

1.什么是对象 1.Python中创建类的关键字是 class 2.类的成员方法 1.函数是写在类外面的,方法则是写在类里面的 1.上面这一段代码中就展示了如何在方法中访问类的成员变量: self.成员变量名 3.魔术方法 魔术方法其实就是python中的类中的内置方法,下面这几个只是我们比较常…

高级语言期末2011级B卷

1.编写函数&#xff0c;实现按照如下公式计算的功能。其中n为自然数。 #include <stdio.h>int fac(int n) {if(n0)return 1;elsereturn n*fac(n-1); }double func(int n) {if(n0)return 0;return 1.0*n/((n1)*fac(n2))func(n-1); } 2.编写函数&#xff0c;对给定的整数数…

Flutter Engine 编译

本地环境 Flutter 开发基本环境配置&#xff0c;SDK【】 MAC. M2芯片 git工具 python环境[MAC自带] xcode Chromium depot_tools depot_tools 是调试 Flutter 引擎的必备工具包&#xff0c;包含了 gclient、gn 和 ninja 等工具&#xff0c;这些在下面会用到&#xff01;…

线段树学习笔记 下

可持久化线段树 上面两篇是几年前写的&#xff0c;笔者今日才加以整理&#xff0c;如有错误请见谅。 线段树加上版本就是可持久化线段树。 Problem Intro 给定一个数组&#xff0c;只需要单点修改和单点查询&#xff0c;但要维护版本。 具体说&#xff0c;每一次操作可能从…

中兴助力低空经济发展,携山东移动完成5G-A通感一体商用验证

日前&#xff0c;中兴通讯在5G-A通感一体化技术研究和商用落地领域实现新突破。具体来说&#xff0c;中兴通讯联手山东移动&#xff0c;率先完成了5G-A&#xff08;5G-Advanced&#xff09;通感一体化技术试点&#xff0c;完成对低空无人机的通信感知融合测试。据悉&#xff0c…