Java 中的正则表达式
- 转义字符由反斜杠\x组成,用于实现特殊功能
- 当想取消这些特殊功能时可以在前面加上反斜杠\
例如在Java中当\出现时是转义字符的一部分,具有特殊意义,前面加一个反斜可以取消其特殊意义,表示1个普通的反斜杠\,\\\\表示2个普通的反斜杠\\。其实就是要求Java中的字符串输出结果是正确的正则表达式。
1. 概念
正则表达式其实就是规则。
2. 字符类
- 单字符匹配规则,语法示例:
- [abc]:a 或者 b,或者 c 字符中的一个;
- [^abc]:除 a,b,c 以外的任何字符中的一个;
- [a-z]:a-z 小写字母中的一个;
- [A-Z]:A-Z 大写字母中的一个;
- [0-9]:0-9 数字中的一个;
- [a-zA-Z0-9]:a-z 或者 A-Z 或者 0-9 中的一个;
- [a-dm-p]:a 到 d 或 m 到 p 中的一个。
3. 逻辑运算符
- 语法示例:
- &&:并且
- | :或者
4. 预定义字符
- 语法示例:
- “.” : 匹配任何字符;
- “\d”:任何数字 [0-9] 的简写;
- “\D”:任何非数字 [^0-9] 的简写;
- “\s”: 空白字符 [ \t\n\x0B\f\r] 的简写;
- “\S”: 非空白字符 [^\s] 的简写;
- “\w”:大小字母或数字或下划线或汉字;
- “\W”:非单词字符 [^\w] ;
- “\t”:一个 Tab 的间隔。
5. 数量词
- 语法示例:
- X? : 0 次或 1 次;
- X* : 0 次或者多次;
- X+ : 1 次或者多次;
- X{n} : 正好好 n 次;
- X{n,} : 至少 n 次;
- X{n,m}: n 到 m 次(n 和 m 都是包含的)
正则表达式的作用:
(1)检验字符串是否满足某些规则。
(2)查找一段文本中满足某些规则的内容。
1、下面是作用1:检验字符串是否满足某些规则的练习
(1)请编写正则表达式验证用户输入的手机号码是否满足要求。
- 中国手机号码是以 13、14、15、16、17、18、19 开头的11位数字:1[3-9]
String regex = "1[3-9]\\d{9}";System.out.println("15236302279".matches(regex));
(2)请编写正则表达式验证用户输入的邮箱号是否满足要求。
- 邮箱包括用户名和域名两部分,它们之间由@符号连接
- 用户名包括字母、数字和下划线,至少有一个字符:\\w+
- 域名包括两部分:邮箱服务提供商和域名
- 邮箱服务提供商:任意的字母加数字,总共出现2-7次:[\\w&&[^_]]{2,7}
- 域名:大小写字母,如.com,.cn,.edu.cn等,出现2-3次:(\\.[a-zA-Z]+){1,2}
String regex2 = "\\w+@[\\w&&[^_]]{2,7}(\\.[a-zA-Z]+){1,2}";System.out.println("liuyujie@163.com".matches(regex2));
(3)请编写正则表达式验证用户输入的座机号码是否满足要求。
- 座机号码包括区号和电话号码两部分,它们之间通常用连字符
-
隔开。有时候也可以省略连字符。 - 区号一般是3位或4位数字,第一位是0:0\\d{2,3}
- 连字符-,有时也可省略:-?
- 电话号码一般是7位或8位数字,第一位不能为0:\\d{7,8}。
String regex3 = "0\\d{2,3}-?\\d{7,8}";System.out.println("010-12345678".matches(regex3));
2、查找一段文本中满足某些规则的内容
练习:
- 首先获取正则表达式的对象;
- 然后获取文本匹配器的对象;
- find()方法:文本匹配器从头开始读取,寻找是否有满足规则的子串。如果没有,方法返回false;如果有,返回true。在底层记录子串的起始索引和结束索引+1。
- group()方法:方法底层会根据find方法记录的索引进行字符串的截取,其实就是利用substring(起始索引,结束索引);包头不包尾,把截取的小串进行返回。
//1.获取正则表达式的对象Pattern p = Pattern.compile("Java\\d{0,2}");//2.获取文本匹配器的对象//m去读取text,找符合p规则的子串Matcher m = p.matcher(text);//3.利用循环获取while (m.find()) {String s = m.group();System.out.println(s);}
有如下文本,按要求爬取数据。
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文本。
6. 零宽断言和负向零宽断言
- (?=...) 用于查找在某些内容(但并不包括这些内容)之前的东西。
- (?!...) 排除某些内容的匹配。例如:\d{3}(?!\d),首先匹配三位数字,然后这三位数字的后面不能是数字。
- (?:...)用来对表达式进行分组,但是不会捕获。例如:表示匹配 "Java" 这个单词,但不会把它作为一个捕获组,因此不能通过后向引用\1等方式再次使用这个匹配结果。
String s = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//1.定义正则表达式//?指代前面的数据Java//=表示在Java后面要跟随的数据//但是在获取的时候,只获取前半部分//需求1:String regex2 = "((?i)Java)(?=\\d{1,2})";//需求2:String regex2 = "((?i)Java)(\\d{1,2})";String regex3 = "((?i)Java)(?:\\d{1,2})";//需求3:String regex4 = "((?i)Java)(?!\\d{1,2})";Pattern p = Pattern.compile(regex4);Matcher m = p.matcher(s);while (m.find()) {System.out.println(m.group());}
7. 贪婪匹配和懒惰匹配
- 贪婪匹配:匹配尽可能多的字符。
- 懒惰匹配:匹配尽可能少的字符。
- 正则表达式在匹配多个字符时尽可能多,默认是贪婪匹配;如果在后面加上?则表示懒惰匹配,如 +? 表示懒惰匹配。
8. 忽略大小写
- (?i) :在开头使用表示接下来所有的数据都忽略大小写,但是一个字符串中如果只想忽略某个字符的大小写,可以这样写:a((?i)b)c,只忽略字母b的大小写,a和c只能是小写。
9. 捕获分组和非捕获分组
- 捕获分组是用()定义的分组,它可以把匹配到的内容保存到一个单独的组中,以便后续引用或者在匹配后进行处理。
- (?:) (?=) (?!)都是非捕获分组,更多的使用(?:...)这样的语法来剥夺一个分组对组号分配的参与权。
10. 分组组号
- ()表示捕获分组。
- 组号如何识别?从左往右,左括号是第几个就是第几组,组号是连续不间断的。
- \\X:表示把第X组的内容再出来用一次。
需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符。
- 用.来匹配第一个字符。
String regex = "(.).*\\1";System.out.println("a121a".matches(regex));
需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符。
String regex2 = "(.+).*\\1";System.out.println("abc123abc".matches(regex2));
需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致。
String regex3 = "((.)\\2*).*\\1";System.out.println("aaa123aaa".matches(regex3));
需求4:将字符串“我要学学编编编编程程程程程程”替换为“我要学编程”,即将重复的字符替换为单个字符。
- 如何获取一段文本中重复2次及以上的字符?(.)\\1+
- 字符串的replaceAll和split两个方法都可以使用正则表达式
- 在正则表达式外使用分组,格式为$X,其中X为组号
String text = "我要学学编编编编程程程程程程";String regex = "(.)\\1+";System.out.println(text.replaceAll(regex, "$1"));
结合需求1-3以及4的思考:
public class RegexDemo7 {public static void main(String[] args) {String text = "1a222a";String regex1 = "(.).*\\1";Pattern p = Pattern.compile(regex1);Matcher m = p.matcher(text);while (m.find()) {String s = m.group();System.out.println(s);}}
}
输出结果
当文本为下面这个时输出结果为
String text = "1a121a";
相关文章:

Java 中的正则表达式
转义字符由反斜杠\x组成,用于实现特殊功能当想取消这些特殊功能时可以在前面加上反斜杠\ 例如在Java中当\出现时是转义字符的一部分,具有特殊意义,前面加一个反斜可以取消其特殊意义,表示1个普通的反斜杠\,\\\\表示2个…...

华为配置蓝牙终端定位实验
个人主页:知孤云出岫 目录 配置蓝牙终端定位示例 业务需求 组网需求 数据规划 配置思路 配置注意事项 操作步骤 配置文件 配置蓝牙终端定位示例 组网图形 图1 配置蓝牙终端定位示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业…...

搭建hadoop+spark完全分布式集群环境
目录 一、集群规划 二、更改主机名 三、建立主机名和ip的映射 四、关闭防火墙(master,slave1,slave2) 五、配置ssh免密码登录 六、安装JDK 七、hadoop之hdfs安装与配置 1)解压Hadoop 2)修改hadoop-env.sh 3)修改 core-site.xml 4)修改hdfs-site.xml 5) 修改s…...

pytorch-pytorch之LSTM
目录 1. nn.LSTM2. nn.LSTMCell 1. nn.LSTM 初始化函数输入参数与RNN相同,分别是input_size,hidden_size和num_layer foward函数也与RNN类似,只不过返回值除了out外,ht变为(ht,ct) 代码见下图: 2. nn.LSTMCell 初…...

jvm优化
1.jvm组成 什么是jvm,java是跨平台语言,对不同的平台(windos,linux),有不同的jvm版本。jvm屏蔽了平台的不同,提供了统一的运行环境,让java代码无需考虑平台的差异。 jdk包含jre包含…...

网络安全——防御课实验二
在实验一的基础上,完成7-11题 拓扑图 7、办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 首先,按照之前的操作,创建新的安全区(电信和移动)分别表示两个外网…...

朴素模式匹配算法与KMP算法(非重点)
目录 一. 朴素模式匹配算法1.1 什么是字符串的匹配模式1.2 朴素模式匹配算法1.3 通过数组下标实现朴素模式匹配算法 二. KMP算法2.1 算法分析2.2 用代码实现(只会出现在选择题,考察代码的概率不大) 三. 手算next数组四. KMP算法的进一步优化4…...

[k8s源码]2.CURD deployment
加载kubernetes配置 使用 clientcmd方法,是通过"k8s.io/client-go/tools/clientcmd"包加载的。这个函数返回的是config和error两个值。可以看到返回的config是一个指针变量。 func clientcmd.BuildConfigFromFlags(masterUrl string, kubeconfigPath str…...

使用base64通用文件上传
编写一个上传文件的组件 tuku,点击图片上传后使用FileReader异步读取文件的内容,读取完成后获得文件名和base64码,调用后端uploadApi,传入姓名和base64文件信息,后端存入nginx中,用于访问 tuku.ts组件代码: <templa…...

Python深度学习
python深度学习,python代码定制, 可做创新点 创新思路 代码改进跑通 深度学习 Python代跑时间序列预测 分析 代码编写 python编程 深度学习算法 自然语言处理 神经网络跑通指导 爬虫调试代做 项目指导 定制帮做 改进 提升 创新 优化 Python Matlab C…...

django报错(三):No crontab program或got an unexpected keyword argument ‘user’
Crontab是linux系统上的定时管理模块,简单配置,灵活使用。但是要在windows使用必须借助Cygwin等虚拟工具,否则会报错“No crontab program”。如下图: python-crontab是其提供了python模块对crontab的访问,即可以通过p…...

数据库(创建数据库和表)
目录 一:创建数据库 二:创建表 2.1:创建employees表 2.2:创建orders表 2.3:创建invoices表 一:创建数据库 mysql> create database mydb6_product; Query OK, 1 row affected (0.01 sec) mysql&g…...

Log4j的原理及应用详解(一)
本系列文章简介: 在软件开发的广阔领域中,日志记录是一项至关重要的活动。它不仅帮助开发者追踪程序的执行流程,还在问题排查、性能监控以及用户行为分析等方面发挥着不可替代的作用。随着软件系统的日益复杂,对日志管理的需求也日…...

ubuntu系统Docker常用命令
1.查看docker是否开机启动 sudo systemctl list-unit-files | grep enable|grep docker 2.设置开机启动 sudo systemctl enable docker 3.关闭docker开机启动 sudo systemctl disable docker 4.开启docker服务 sudo service docker start 5.关闭docker服务 sudo servi…...

韦东山嵌入式linux系列-驱动设计的思想(面向对象/分层/分离)
1 面向对象 字符设备驱动程序抽象出一个 file_operations 结构体; 我们写的程序针对硬件部分抽象出 led_operations 结构体。 2 分层 上下分层,比如我们前面写的 LED 驱动程序就分为 2 层: ① 上层实现硬件无关的操作,比如注册…...

0/1背包
0/1背包 背包问题是DP最经典的类型之一,而0/1背包是最经典最基础的背包问题。 背包体积为 V V V, n n n种物品,每种物品只有1个,第 i i i种物品对应体积为 c i c_i ci,价值为 w i w_i wi,怎样装填能使…...

Linux的进程和权限的基本命令
目录 基本命令 man find date cal du ln exit grep 基本命令-帮助查询: wc cat more less head tail echo alias unalias 基本命令-进程管理: ps kill top 操作系统负载查看 用户分类: 程序用户 普通用户&#x…...

鼠标录制工具怎么挑选?9款电脑鼠标录制工具分享(2024)
你知道鼠标录制工具吗?鼠标录制工具通过记录和回放用户的操作,帮助自动化重复性任务,提高工作效率和精确性。它可以帮助用户简化很多繁琐的操作步骤,非常适合运用在电脑自动化任务、游戏自动化中,给大家整理了2024年9款…...

C1W4.LAB.Vector manipulation+Hash functions and multiplanes
理论课:C1W4.Machine Translation and Document Search 文章目录 Python 中的矢量操作Transforming vectorsExample 1Example 2 Frobenius Norm Hash functions and multiplanesBasic Hash tablesPlanesHash Function with multiple planesRandom PlanesDocument v…...

YOLOv8改进 | 检测头 | 融合渐进特征金字塔的检测头【AFPN4】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…...

数据采集监控平台:挖掘数据价值 高效高速生产!
在当今数字化的时代,数据已成为企业非常宝贵的资产之一。然而,要充分发挥数据的潜力,离不开一个强大的数据采集监控平台,尤其是生产制造行业。它不仅是数据的收集者,更是洞察生产的智慧之眼,高效高速处理产…...

【算法笔记自学】第 9 章 提高篇(3)——数据结构专题(2)
9.1树与二叉树 #include <cstdio>int main() {int n, m;scanf("%d%d", &n, &m);printf(n m 1 ? "Yes" : "No");return 0; } 9.2二叉树的遍历 #include <cstdio> #include <vector> using namespace std;const int…...

Objective-C 中字符串的保存位置
在 Objective-C 中,字符串常量和动态创建的字符串(例如通过 stringWithFormat:、initWithString: 等方法创建的字符串)在内存中保存的位置一样么 ? 在 Objective-C 中,字符串常量和动态创建的字符串在内存中的保存位置…...

git 想要创建一个新的本地分支并检出远程分支的内容
如果你想要创建一个新的本地分支并检出远程分支的内容: git checkout -b feature-branch origin/feature-branch feature-branch 是你在本地创建的新分支名,origin/feature-branch 是远程分支的引用。 根据你检出的远程分支的名字而定 不知道名称的时…...

C语言学习笔记[24]:循环语句while②
getchar()的使用场景 int main() {char password[20] {0};printf("请输入密码:");//输入 123456 后回车scanf("%s", passwoed);//数组名本身就是数组地址printf("请确认密码:Y/N");int ch getchar();if(Y ch)printf(&…...

安全运营概述
安全运营概述 概述安全运营的工作对内安全运营工作对外安全运营工作品牌建设 概述 安全是一个过程,安全是靠运营出来的,公司会不断的有新业务的变更,新产品的发布,新版本的升级,技术架构的升级,底层系统的…...

spring-cloud和spring-cloud-alibaba的关系
首先Spring Cloud 是什么? Spring Cloud是一系列框架的有序集合,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发。Spring Cloud提供了微服务架构开发所需的多种组件和工具,如服务发现注册、配置中心、消息总线、负载均…...

持续集成06--Jenkins构建触发器
前言 在持续集成(CI)的实践中,构建触发器是自动化流程中不可或缺的一环。它决定了何时启动构建过程,从而确保代码变更能够及时地得到验证和反馈。Jenkins,作为业界领先的CI/CD工具,提供了多种构建触发器选项…...

根据视图矩阵, 恢复相机的世界空间的位置
根据视图矩阵, 恢复相机的世界空间的位置 一、方法1 glsl 实现: // 从本地局部坐标系(相机空间) 到 世界空间的旋转变换 mat3 getLocal2WorldRotation() {mat3 world2localRotation mat3(viewMatrix[0].xyz,viewMatrix[1].xyz,viewMatrix[2].xyz);return inverse(world2loca…...

使用pytest-playwright截图和录制视频并添加到Allure报告
一、依赖环境 python, version==3.9.5 pytest-playwright, version==0.5.1 allure-pytest, version==2.13.5 pytest, version==6.2.5 allure, version==2.22.0pytest-playwright支持如下命令行参数: Playwright:--browser={chromium,firefox,webkit}Browser engine which …...