【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://www.mzph.cn/news/700036.shtml

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

相关文章

工作中常见问题总结

工作中常见错误清单 1、springboot实现无数据库启动 问题 springboot往往是作为b/s系统的server端的架子来使用&#xff0c;但是有些时候&#xff0c;是作为静默的server&#xff0c;并没有界面和数据库&#xff0c;但是springboot默认是链接数据库的&#xff0c;如何解决这个…

2024年初中生古诗文大会备考:选择题往年真题练习和解析

今天我们继续来做初中古诗文大会的选择题真题&#xff0c;让大家了解初中生古诗文大会的考察内容&#xff0c;并且提供了我独家的题目解析和答案&#xff0c;供孩子们参考。 Tips&#xff1a;通过对古诗文大会题目的解析发现&#xff0c;古诗文大会的许多题目都来自于中考、高…

Druid无法登录监控页面

问题表现&#xff1a;在配置和依赖都正确的情况下&#xff0c;无法通过配置的用户名密码登录Druid的监控页面 检查配置发现 配置的用户名和密码和请求中参数是一致的&#x1f914; Debug发现 ResourceServlet 是Druid的登录实现&#xff0c; 且调试发现usernameParam是null&am…

在jar里限制指定的包名才可调用(白名单)。

1. 在jar包中定义一个接口&#xff0c;例如 用于检查传入的hash值是否匹配预设的值。 2. 在调用接口的地方&#xff0c;获取当前应用的hash值。 3. 将当前应用的hash值与预设的值进行比较&#xff0c;如果匹配&#xff0c;则允许调用接口&#xff1b;否则&#xff0c;拒绝调用。…

Apache Maven简介

Maven 简介 Apache Maven 是一个用于项目构建、依赖管理和项目信息管理的强大工具。它基于项目对象模型(Project Object Model,POM)进行构建,通过描述项目的结构和依赖关系来管理项目的构建过程。 以下是 Apache Maven 的一些关键原理和工作流程: 项目对象模型(POM)…

网络 - OkHttp

一、概念 二、基本使用 2.1 get请求 fun getCall() {//创建客户端val client OkHttpClient.Builder().connectTimeout(5000, TimeUnit.MILLISECONDS).build()//创建请求val request Request.Builder().get().url("https://www.baidu.com").build()//创建任务val…

python程序设计基础:字符串与正则表达式

第四章&#xff1a;字符串与正则表达式 4.1字符串 最早的字符串编码是美国标准信息交换码ASCII&#xff0c;仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII码采用1个字节来对字符进行编码&#xff0c;最多只能表示256个符号。 随着信息技…

【数据结构与算法初学者指南】【冲击蓝桥篇】String与StringBuilder的区别和用法

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

docker打包当前dinky项目

以下是我的打包过程&#xff0c;大家可以借鉴。我也是第一次慢慢摸索&#xff0c;打包一个公共项目&#xff0c;自己上传。 如果嫌麻烦&#xff0c;可以直接使用我的镜像&#xff0c;直接跳到拉取镜像&#xff01; <可以在任何地方的服务器进行拉取> docker打包当前din…

LLMs之Gemma:Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略

LLMs之Gemma&#xff1a;Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略 导读&#xff1a;此文章介绍了Google推出的新一代开源模型Gemma&#xff0c;旨在帮助研发人员负责任地开发AI。 背景&#xff1a; >> Google长期致力于为开发者和研究人…

如何在 非C盘 安装 WSL?

来源&#xff1a;https://superuser.com/questions/1572834/is-there-any-way-to-install-wsl-on-non-c-drive 首先打开 Powershell&#xff0c;输入如下命令 &#xff08;Set-Location 到你想放置 WSL2 的磁盘&#xff09; # Substitute the drive on which you # want WSL …

linux下搭建boost、muduo、mysql、nginx

参考博客&#xff1a; 1.boost&#xff1a;C网络编程 - Boost::asio异步网络编程 - 01- boost库源码编译安装 2.muduo&#xff1a;C muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装 3.mysql&#xff1a; sudo apt-get install mysql-server sudo apt-get inst…

Vue(学习笔记)

什么是Vue Vue是一套构建用户界面的渐进式框架 构建用户界面&#xff1a; 基于数据渲染出用户可以看到的界面 渐进式&#xff1a; 所谓渐进式就是循序渐进&#xff0c;不一定非得把Vue中的所有API都学完才能开发Vue&#xff0c;可以学一点开发一点 创建Vue实例 比如就上面…

猫头虎分享已解决Bug || ImportError: Keras requires TensorFlow 2.2 or higher

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

C++函数对象-运算符函数对象 - 旧式绑定器与适配器 - 从成员函数指针创建包装器,能以一个对象引用调用 (std::mem_fun_ref)

任何定义了函数调用操作符的对象都是函数对象。C 支持创建、操作新的函数对象&#xff0c;同时也提供了许多内置的函数对象。 旧式绑定器与适配器 早期提供功能支持的几个工具在 C11 中弃用&#xff0c;并于 C17 中移除&#xff08;旧否定器于 C17 中弃用并于 C20 中移除&#…

Devc++ 开发的 Easyx 瓦片地图编辑器之自定义贴图导入模块

接上次开发 Editing While Playing 使用 Easyx 开发的 RPG 地图编辑器 tilemap eaitor-CSDN博客 由于还不能导入自己绘制的贴图&#xff0c;所以还要增加自定义贴图的导入导出模块 这里就单独搓了一个自定义导入导出部分&#xff0c;之后再缝合进瓦片地图编辑器里 #include &…

openai sora 只能根据文本生成视频?不,TA 是通用物理世界模拟器

视频生成模型作为世界模拟器 我们探索了在视频数据上进行大规模生成模型的训练。 具体来说&#xff0c;我们联合在可变持续时间、分辨率和长宽比的视频和图像上训练文本条件扩散模型。 我们利用了一个在视频和图像潜在编码的时空补丁上操作的变压器架构。 我们最大的模型So…

C++的string容器->基本概念、构造函数、赋值操作、字符串拼接、查找和替换、字符串比较、字符存取、插入和删除、子串

#include<iostream> using namespace std; #include <string> //string的构造函数 /* -string(); //创建一个空的字符串 例如: string str; -string(const char* s); //使用字符串s初始化 -string(const string& str); //使…

Leetcode 209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

MYSQL--触发器

一:介绍: 1.触发器实际上就是一种特殊的存储过程,两者都能够在MYSQL当中完成特定的功能,存储在服务器上的特殊SQL片段,可以重复进行使用,提高复用性的一种功能.但是触发器并不需要进行调用,在使用DML操作的时候会自动的调用相关的触发器操作 2.触发器能够对于DML操作当中的,删除…