学习java时候的笔记(十九)

正则表达式

作用:

  • 校验字符串是否满足规则
  • 在一段文本中查找满足要求的内容

字符类(只匹配一个字符)

说明
[abc]只能是a,b或c
[^abc]除了a,b,c之外的任何字符
[a-zA-Z]a 到 z, A 到 Z(范围)
[a-d[m-p]]a 到 d, 或 m 到 p
[a - z && [def]]a 到 z和def的交集。为: d, e, f
[a - z && [^bc]]a 到 z和非bc的交际 ( 等同于[ad-z] )
[a-z&&[^m-p]]a 到 z和除了m到p的交集

Demo:

public class RegexDemo1 {public static void main(String[] args) {System.out.println("-------------1----------------");String str1 = "a";System.out.println(str1.matches("[abc]"));//trueSystem.out.println(str1.matches("[a-c]"));//trueSystem.out.println(str1.matches("[^a-c]"));//trueSystem.out.println("ab".matches("[a-c]"));//false 原因: [a-c]只能匹配一个,有两个字符要去匹配两次System.out.println("ab".matches("[a-c][a-c]"));//trueSystem.out.println("-------------2----------------");System.out.println("n".matches("[a-d[m-p]]"));//trueSystem.out.println("nn".matches("[a-d[m-p]]"));//falseSystem.out.println("nn".matches("[a-d[m-p]][a-d[m-p]]"));//trueSystem.out.println("-------------3----------------");//如果要表示两个范围的交集, 要用 &&//如果只写一个 & ,则仅仅是表示一个字符 &System.out.println("a".matches("[a-z&&[def]]"));//falseSystem.out.println("d".matches("[a-z&&[def]]"));//trueSystem.out.println("a".matches("[a-z&[def]]"));//trueSystem.out.println("-------------4----------------");System.out.println("a".matches("[a-z&&[^def]]"));//trueSystem.out.println("d".matches("[a-z&&[^def]]"));//false}
}

预定义字符(只匹配一个字符)

表达式字符
.任何字符
\d一个数字: [0-9]
\D非数字: [^0-9]
\s一个空白字符: [\t\n\x0B\f\r]
\S非空白字符: [^\s]
\w[a-zA-Z_0-9]英文、数字、下划线
\W[^\w]一个非单词字符

Demo:

public class RegexDemo2 {public static void main(String[] args) {System.out.println("-------------1----------------");//.表示一个任意字符System.out.println("你".matches("."));//trueSystem.out.println("你n".matches("."));//falseSystem.out.println("你n".matches(".."));//trueSystem.out.println("-------------2----------------");//  \d表示一个数字System.out.println("9".matches("\\d"));//trueSystem.out.println("a".matches("\\d"));//falseSystem.out.println("99".matches("\\d"));//falseSystem.out.println("99".matches("\\d\\d"));//trueSystem.out.println("-------------3----------------");// \D 表示非数字System.out.println("9".matches("\\D"));//falseSystem.out.println("a".matches("\\D"));//trueSystem.out.println("ab".matches("\\D"));//falseSystem.out.println("ab".matches("\\D\\D"));//trueSystem.out.println("-------------3----------------");// \s一个空白字符System.out.println("\t".matches("\\s"));//trueSystem.out.println("\t\t".matches("\\s"));//falseSystem.out.println(" ".matches("\\s"));//trueSystem.out.println("  ".matches("\\s"));//falseSystem.out.println("9".matches("\\s"));//falseSystem.out.println("a".matches("\\s"));//falseSystem.out.println("-------------4----------------");// \S非空白字符System.out.println("\t".matches("\\S"));//falseSystem.out.println(" ".matches("\\S"));//falseSystem.out.println("a".matches("\\S"));//trueSystem.out.println("9".matches("\\S"));//trueSystem.out.println("-------------5----------------");// \w [a-zA-Z_0-9]英文、数字、下划线System.out.println("a".matches("\\w"));//trueSystem.out.println("A".matches("\\w"));//trueSystem.out.println("0".matches("\\w"));//trueSystem.out.println("_".matches("\\w"));//trueSystem.out.println("-------------5----------------");// \W 一个非单词字符System.out.println("&".matches("\\W")); //trueSystem.out.println("a".matches("\\W")); //falseSystem.out.println("A".matches("\\W")); //falseSystem.out.println("0".matches("\\W")); //falseSystem.out.println("_".matches("\\W")); //false}
}

数量词(表中的 ‘X’ 代表任意内容)

表达式说明
X?X,一次或0次
X*X,零次或多次
X+X,一次或多次
X{n}X,正好n次
X{n, }X,至少n次
X{n, m}X,至少n次但不超过m次

Demo:

public class RegexDemo3 {public static void main(String[] args) {System.out.println("a".matches("[abc]?"));//true  一次或0次System.out.println("".matches("[abc]?"));//trueSystem.out.println("aaa".matches("[abc]*"));//true  零次或多次System.out.println("".matches("[abc]*"));//trueSystem.out.println("".matches("[abc]+"));//false  一次或多次System.out.println("a".matches("[abc]+"));//trueSystem.out.println("aa".matches("[abc]+"));//trueSystem.out.println("aaa".matches("[abc]{3}"));//true  刚好三次System.out.println("aaaa".matches("[abc]{3}"));//falseSystem.out.println("aa".matches("[abc]{3}"));//falseSystem.out.println("aa".matches("[abc]{3,}"));//false  至少三次System.out.println("aaa".matches("[abc]{3,}"));//trueSystem.out.println("aaaa".matches("[abc]{3,}"));//trueSystem.out.println("aaa".matches("[abc]{3,4}"));//true//至少三次但不超过四次System.out.println("aaaa".matches("[abc]{3,4}"));//trueSystem.out.println("aa".matches("[abc]{3,4}"));//falseSystem.out.println("aaaaa".matches("[abc]{3,4}"));//false}
}

爬虫

正则表达式的对象:Pattern

文本匹配器对象:Matcher

Pattern常见方法:

(待完善)

Matcher常见方法:

(待完善)

方法名说明
find()拿着文本匹配器从头开始读取, 寻找是否有满足规则的字符串.如果没有,方法返回false,如果有,返回true
m.group()该方法底层会根据find方法记录的索引进行字符串的截取,会把截取的小字符串进行返回

Demo1:

package RegexDemo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class crawler {public static void main(String[] args) {/*有如下文本,请按照要求爬取数据。Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是ava8和ava11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台要求:找出里面所有的JavaXX*/String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//        method1(str);//1.获取正则表达式的对象,也就是Pattern的对象Pattern p = Pattern.compile("Java\\d{0,2}");//2.获取文本匹配器的对象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: 文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。在大串中去找符合匹配规则的子串。//1.获取正则表达式的对象,也就是Pattern的对象Pattern p = Pattern.compile("Java\\d{0,2}");//2.获取文本匹配器的对象//m: 文本匹配器的对象//str: 大的字符串//p: 规则//m要在str中找符号p规则的小的字符串Matcher m = p.matcher(str);//拿着文本匹配器从头开始读取, 寻找是否有满足规则的字符串//如果没有,方法返回false//如果有,返回true,在底层记录子串的起始索引和结束索引+1boolean b = m.find();//该方法底层会根据find方法记录的索引进行字符串的截取//会把截取的小字符串进行返回String s1 = m.group();System.out.println(s1);}
}

Demo2:

package RegexDemo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class crawlerTwo {public static void main(String[] args) {String s = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//定义正则表达式//? 理解为前面的数据Java//= 表示后面要跟随的数据//但是在获取的时候只获取前半部分// (?i) : 忽略大小写String regex1 = "((?i)Java)(?=8|11|17)";//下面两个效果相同//使用 " : " 时获取数据的时候获取全部String regex2 = "((?i)Java)(8|11|17)";String regex3 = "((?i)Java)(?:8|11|17)";//去掉Java后面后 8/11/17 的数据String regex4 = "((?i)Java)(?!8|11|17)";Pattern p = Pattern.compile(regex1);Matcher m = p.matcher(s);while (m.find()) {System.out.print(m.group() + " ");}System.out.println();Pattern p1 = Pattern.compile(regex2);Matcher m1 = p1.matcher(s);while (m1.find()) {System.out.print(m1.group() + " ");}System.out.println();Pattern p2 = Pattern.compile(regex3);Matcher m3 = p2.matcher(s);while (m3.find()) {System.out.print(m3.group() + " ");}System.out.println();Pattern p3 = Pattern.compile(regex4);Matcher m4 = p3.matcher(s);while (m4.find()) {System.out.print(m4.group() + " ");}}
}

Demo3:

package RegexDemo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class crawlerThree {public static void main(String[] args) {/*需求1∶按照ab+的方式爬取ab,b尽可能多获取需求2:按照ab+的方式爬取ab,b尽可能少获取*/String s ="Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa" +"经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//贪婪爬取  (Java默认)String regex = "ab+";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(s);while (m.find()){System.out.println(m.group());}//非贪婪爬取  (在 " + " 后面加一个问号就行了)String regex1 = "ab+?";Pattern p2 = Pattern.compile(regex1);Matcher m2 = p2.matcher(s);while (m2.find()){System.out.println(m2.group());}}
}

正则表达式在字符串方法中的使用:

方法名说明
matches(String regex)判断字符串是否满足正则表达式规则
replaceAll(String regex, String newstr)按照正则表达式规则进行替换
split(String regex)按照正则表达式的规则切割字符串

Demo4:

package RegexDemo;public class crawlerFour {public static void main(String[] args) {/*有一段字符串:小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠要求1:把字符串中三个姓名之间的字母替换为vs要求2:把字符串中的三个姓名切割出来*/String s = "小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠";String result1 = s.replaceAll("[\\w && [^_]]+", "vs");System.out.println(result1);String[] s1 = s.split("[\\w &&[^_]]+");for (int i = 0; i < s1.length; i++) {System.out.println(s1[i]);}}
}

最后:欢迎大家关注我的公众号
在这里插入图片描述

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

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

相关文章

【树莓派学习】系统烧录及VNC连接、文件传输

【树莓派学习】系统烧录及VNC连接、文件传输 Raspberry Pi is a series of small single-board computers (SBCs) developed in the United Kingdom by the Raspberry Pi Foundation in association with Broadcom. Since 2013, Raspberry Pi devices have been developed and…

Ubuntu20.4版本安装ROS教程

一、配置源 安装成功的Ubuntu系统自带的工具下载速度慢&#xff0c;不太好用&#xff0c;所以我们可以使用国内稳定高速且免费的镜像网站。 清华源&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simple 中科大&…

启动 UE4编辑器报 加载 Plugin 失败

启动 UE4编辑器报 加载 Plugin 失败&#xff0c;报如下错误&#xff1a; Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. …

TorchEEG文档_学习笔记1【代码详解】

文章目录 一、用户文档1.安装Pytorch2.安装TorchEEG3.安装与图算法的插件 二、教程1.使用TorchEEG完成深度学习工作流程2datasets模块3.transforms模块4.models模块5.trainer模块6.使用Vanilla PyTorch训练模型 一、用户文档 1.安装Pytorch TorchEEG依赖于PyTorch,根据系统、…

MYSQL之增删改查(下)

前言&#xff1a; 以下是MySQL最基本的增删改查语句&#xff0c;很多IT工作者都必须要会的命令&#xff0c;也 是IT行业面试最常考的知识点&#xff0c;由于是入门级基础命令&#xff0c;所有所有操作都建立在单表 上&#xff0c;未涉及多表操作。 4.3 高级查询 4.3.1 聚合函…

Navicat 干货 | 了解 PostgreSQL 规则

PostgreSQL 是一个强大的开源关系型数据库管理系统&#xff0c;为增强数据管理和操作提供了丰富的功能。这些功能中包含了规则&#xff0c;这是一种用于控制数据库内部查询和命令处理方式的机制。本文将探讨 PostgreSQL 规则的工作原理&#xff0c;以及它们与触发器的区别&…

实验室三大常用仪器1---示波器的基本使用方法(笔记)

目录 示波器的作用 示波器的基础操作方法 示波器测量突变脉冲 示波器的作用 示波器能帮助我们干什么&#xff1f; 比如说某个电源用万用表测量是稳定的5V输出 但是用示波器一看确实波涛汹涌 这样的电源很可能回导致系统异常工作 又比如电脑和单片机进行串口通信时&#xf…

【C++干货基地】面向对象核心概念 const成员函数 | 初始化列表 | explicit关键字 | 取地址重载

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

sketchup创建3D打印机的模型

查了一下&#xff0c;这玩意有几个版本&#xff0c;其中一个sketchup free是免费的&#xff0c;到官网上看看 下载 SketchUp | 免费试用 3D 建模软件 | SketchUp 是个在线网页版&#xff0c;然后可以再这个网站上注册一个账号 弄个邮箱试试看 创建好进入后&#xff0c;里面就…

js 遍历数据结构,使不符合条件的全部删除

js 遍历数据结构&#xff0c;使不符合条件的全部删除 let newSourceJSON.parse(JSON.stringify(state.treeData))state.expandedKeys[]checkedKeys.map((item:any)>{loop(newSource,{jsonPath:item.split(&)[1]},state.expandedKeys)})function removeUnwantedNodes(tre…

SpringCloud系列(7)--Eureka服务端的安装与配置

前言&#xff1a;上一章节我们介绍了Eureka的基础&#xff0c;本章节则介绍Eureka服务端的安装与配置 Eureka架构原理图 1、创建Eureka Server端服务注册中心模块 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并选择模块要使用的JDK版本 (3)填写子模块的名称&#xf…

如何在Windows安装Ollama大语言模型工具并实现无公网IP异地远程使用

文章目录 前言1. 运行Ollama2. 安装Open WebUI2.1 在Windows系统安装Docker2.2 使用Docker部署Open WebUI 3. 安装内网穿透工具4. 创建固定公网地址 前言 本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具&#xff0c;并安装Open WebUI结合cpolar内网穿透软…

详解数据在内存中的存储

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 文章目录 1. 数据类型 1.1 基本数据类型 1.2 派生数据类型 2. 整形在内存中的存储 2.1 …

基于ssm汽车租赁系统业务管理子系统论文

系统简介 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了汽车租赁系统业务管理子系统的开发全过程。通过分析企业对于汽车租赁系统业务管理子系统的需求&#xff0c;创建了一个计算机管理汽车租赁系统业务管理子系统的方案。文章介…

“手撕“三大特性之一的<继承>(上)

目录 一、为什么需要继承 二、什么是继承 三、继承怎么写 四、成员的访问 1.父类与子类的成员变量不同名 2.父类与子类的成员变量同名 3.父类与子类的成员方法不同名 4.父类与子类的成员方法同名 五、super关键字 一、为什么需要继承 先让我们看一段Java代码&#…

数据结构-基于ArrayList的源码模拟

文章目录 继承关系 :1. 构造方法的模拟2. 扩容机制的分析3. 查找方法的模拟4. 获取,修改元素的方法模拟5. 添加元素的模拟6. 删除元素的模拟7. removeAll与retainAll的模拟总结: 边缘方法以及总代码 继承关系 : 1. 构造方法的模拟 源码中我们的ArrayList的构造方法给出了三种实…

Linux:常用软件、工具和周边知识介绍

上次也是结束了权限相关的知识&#xff1a;Linux&#xff1a;权限相关知识详解 文章目录 1.yum-管理软件包的工具1.1基本介绍1.2yum的使用1.3yum的周边生态1.4软件包介绍 2.vim-多模式的文本编辑器2.1基本介绍2.2基本模式介绍2.2.1命令模式&#xff08;Normal mode&#xff09;…

Vue【路由】

1&#xff1a;什么是单页应用程序&#xff08;single page application&#xff09; 所有得功能在一个html页面上实现 2&#xff1a;单页面应用程序的优缺点 优点&#xff1a;按需更新性能高&#xff0c;开发效率也高&#xff0c;用户的体验较好 缺点&#xff1a;学习成本高…

spring的redis注解@Cacheable @Cacheput @CacheEvict的condition、unless

概述 redis的注解使用的过程中总会遇到condition和unless这两个属性&#xff0c;而且不同的注解使用注意事项不一样。本人也是错误使用之后详细查询了一下&#xff0c;作了如下的总结。 Cacheale 这个注解的使用和意义这里不多说&#xff0c;可以查看我的其他文档。这里主要说…

java:Java中的抽象类

什么是抽象类&#xff1a; 我们知道&#xff0c;类用来模拟现实的事物&#xff0c;一个类模拟一类事物&#xff0c;某个类的一个实例化对象可以模拟某个属于该类的具体事物。类中描绘了该类所有对象的共同的特性&#xff0c;当一个类中给出的信息足够全面时候&#xff0c;我们就…