java 正则表达式匹配Matcher 类
Matcher 类 用法
在 Java 中,Matcher 类是用于匹配正则表达式的工具,而 group() 方法是 Matcher 类中的一个重要方法,用于提取匹配结果中的捕获组(captured groups)。以下是对 group() 方法的详细解释:
1. 正则表达式中的捕获组
在正则表达式中,捕获组是通过圆括号 () 定义的。每个 () 内的子表达式都是一个捕获组,匹配的内容可以被单独提取。
例如:
String regex = "(\\d{2})-(\\d{2})-(\\d{4})";
这个正则表达式匹配日期格式(如 12-31-2023),其中:
-
(\\d{2})是第一个捕获组,匹配月份。 -
(\\d{2})是第二个捕获组,匹配日期。 -
(\\d{4})是第三个捕获组,匹配年份。
2. Matcher 类的作用
Matcher 类用于对输入字符串进行正则表达式匹配。它通过 Pattern 类的 matcher() 方法创建。
示例:
Pattern pattern = Pattern.compile("(\\d{2})-(\\d{2})-(\\d{4})");
Matcher matcher = pattern.matcher("12-31-2023");
3. group() 方法的作用
group() 方法用于提取匹配结果中的捕获组。它有几种重载形式:
(1) group()
-
返回整个匹配的字符串。
-
如果没有匹配成功,调用此方法会抛出
IllegalStateException。
示例:
if (matcher.find()) {System.out.println(matcher.group()); // 输出 "12-31-2023"
}
(2) group(int group)
-
返回指定捕获组的匹配内容。
-
捕获组的编号从 1 开始,
group(0)等价于group(),表示整个匹配的字符串。 -
如果指定的捕获组不存在,会抛出
IndexOutOfBoundsException。
示例:
if (matcher.find()) {System.out.println(matcher.group(1)); // 输出 "12"(月份)System.out.println(matcher.group(2)); // 输出 "31"(日期)System.out.println(matcher.group(3)); // 输出 "2023"(年份)
}
(3) group(String name)(Java 7+)
-
返回命名捕获组的匹配内容。
-
命名捕获组通过
(?<name>...)语法定义。 -
如果指定的命名捕获组不存在,会抛出
IllegalArgumentException。
示例:
Pattern pattern = Pattern.compile("(?<month>\\d{2})-(?<day>\\d{2})-(?<year>\\d{4})");
Matcher matcher = pattern.matcher("12-31-2023");if (matcher.find()) {System.out.println(matcher.group("month")); // 输出 "12"System.out.println(matcher.group("day")); // 输出 "31"System.out.println(matcher.group("year")); // 输出 "2023"
}
4. group() 方法的使用步骤
-
编译正则表达式:
Pattern pattern = Pattern.compile("(\\d{2})-(\\d{2})-(\\d{4})"); -
创建
Matcher对象:Matcher matcher = pattern.matcher("12-31-2023"); -
执行匹配:
-
使用
find()方法查找匹配项。 -
或者使用
matches()方法检查整个字符串是否匹配。
-
-
提取捕获组:
-
使用
group()方法提取匹配的内容。
-
示例:
if (matcher.find()) {String month = matcher.group(1); // "12"String day = matcher.group(2); // "31"String year = matcher.group(3); // "2023"System.out.println("Month: " + month + ", Day: " + day + ", Year: " + year);
}
5. 注意事项
-
匹配成功后才能调用
group():-
在调用
group()之前,必须先调用find()或matches()方法,否则会抛出IllegalStateException。
-
-
捕获组编号从 1 开始:
-
group(0)表示整个匹配的字符串,group(1)表示第一个捕获组,依此类推。
-
-
捕获组不存在时抛出异常:
-
如果指定的捕获组编号或名称不存在,会抛出
IndexOutOfBoundsException或IllegalArgumentException。
-
-
命名捕获组需要 Java 7+:
-
命名捕获组功能在 Java 7 及以上版本中支持。
-
6. 完整示例
以下是一个完整的示例,演示如何使用 group() 方法提取捕获组:
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexExample {public static void main(String[] args) {String input = "Date: 12-31-2023, Time: 23:59";String regex = "(\\d{2})-(\\d{2})-(\\d{4}).*?(\\d{2}):(\\d{2})";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(input);if (matcher.find()) {System.out.println("Month: " + matcher.group(1)); // "12"System.out.println("Day: " + matcher.group(2)); // "31"System.out.println("Year: " + matcher.group(3)); // "2023"System.out.println("Hour: " + matcher.group(4)); // "23"System.out.println("Minute: " + matcher.group(5));// "59"} else {System.out.println("No match found!");}}
}
总结
-
group()方法是Matcher类的核心方法,用于提取正则表达式匹配的捕获组。 -
捕获组通过圆括号
()定义,编号从 1 开始。 -
使用
group()前必须调用find()或matches()方法。 -
命名捕获组(Java 7+)可以通过名称提取匹配内容。
find() 和 matches() 方法的区别
1. matches() 方法
-
作用:
-
检查整个输入字符串是否完全匹配正则表达式。
-
如果整个字符串与正则表达式匹配,返回
true;否则返回false。
-
-
匹配范围:
-
必须从字符串的开头匹配到结尾。
-
-
示例:
String regex = "a.b"; // 匹配 "a" + 任意字符 + "b" String input1 = "aab"; String input2 = "aabb";Pattern pattern = Pattern.compile(regex); Matcher matcher1 = pattern.matcher(input1); Matcher matcher2 = pattern.matcher(input2);System.out.println(matcher1.matches()); // true,因为 "aab" 完全匹配 "a.b" System.out.println(matcher2.matches()); // false,因为 "aabb" 不完全匹配 "a.b"
-
适用场景:
-
当需要检查整个字符串是否符合某种格式时(例如验证邮箱、电话号码等)。
-
2. find() 方法
-
作用:
-
在输入字符串中查找与正则表达式匹配的子串。
-
如果找到匹配的子串,返回
true;否则返回false。 -
可以多次调用,每次调用会查找下一个匹配的子串。
-
-
匹配范围:
-
不要求整个字符串匹配,只要字符串中包含与正则表达式匹配的子串即可。
-
-
示例:
String regex = "a.b"; // 匹配 "a" + 任意字符 + "b" String input = "aab aabb";Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input);while (matcher.find()) {System.out.println("Found: " + matcher.group()); // 输出匹配的子串 }输出:
复制
Found: aab Found: aab
-
适用场景:
-
当需要从字符串中提取多个匹配的子串时(例如从日志中提取特定格式的数据)。
-
3. find() 和 matches() 的区别
| 特性 | matches() | find() |
|---|---|---|
| 匹配范围 | 整个字符串必须完全匹配正则表达式。 | 字符串中只要包含匹配的子串即可。 |
| 返回值 | true 或 false。 | true 或 false。 |
| 多次调用 | 每次调用都检查整个字符串。 | 每次调用查找下一个匹配的子串。 |
| 适用场景 | 验证字符串是否符合某种格式。 | 提取字符串中符合某种模式的子串。 |
相关文章:
java 正则表达式匹配Matcher 类
Matcher 类 用法 在 Java 中,Matcher 类是用于匹配正则表达式的工具,而 group() 方法是 Matcher 类中的一个重要方法,用于提取匹配结果中的捕获组(captured groups)。以下是对 group() 方法的详细解释: 1.…...
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…...
CSS(快速入门)
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…...
使用 concurrently 实现前后端一键启动
使用 concurrently 实现前后端一键启动 本文适合: 前后端分离项目(如 React Node.js),希望通过一条命令同时启动前端和后端服务。 工具链: Node.js、npm、concurrently。 耗时: 3 分钟。 文章目录 使用 c…...
常见端口的攻击思路
端口号端口说明攻击方向21/22/69FTP/TFTP文件传输协议匿名上传/下载、嗅探、爆破2049NFS服务配置不当139Sanba服务爆破、远程代码执行389Ldap目录访问协议注入、匿名访问、弱口令22SSH远程连接爆破、SSH映射隧道搭建、文件传输23Telnet远程连接爆破、嗅探、弱口令3389RDP远程桌…...
大数据治理实战:架构、方法与最佳实践
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 大数据治理是确保数据质量、合规性和安全性的重要手段,尤其在数据驱动决策和人工智能应用日益普及的背景下&…...
忘记宝塔的访问地址怎么找
在linux中安装宝塔面板后会生成网址、账号和密码 如果网址忘记了那将进不去宝塔面板该怎么办呢? bt命令 我们输入 bt 命令的时候,是在根目录里面进行操作的。 / bt 我们根据自己的需要,选择对应的数字就可以了。 bt 14 输入 14 查看面板默…...
SQL教程-基础语法
INSERT INTO 新增数据 INSERT INTO 数据表名 VALUES (值1,值2,值3,...) DELETE 删除数据 DELETE FROM 数据表名 WHERE 查询条件 UPDATE 修改数据 UPDATE 数据表名 SET 字段1 值1, 字段2值2, ... WHERE 查询条件 SELECT 查询数据 #查询数据 SELECT 字段1, 字段2, ... FROM 数…...
shell脚本批量修改文件名之方法(The Method of Batch Modifying File Names in Shell Scripts)
shell脚本批量修改文件名方法 我们可以使用Shell脚本来实现这个功能。Shell脚本是一种用于自动化任务的编程语言,它可以在Unix/Linux操作系统上运行。在这个脚本中,我们将使用一个for循环来遍历目标目录下的所有文件,并使用mv命令将每个文件…...
组合模式 - 组合模式的实现
引言 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,从而简化了代码的复杂性。本文将详细介绍如何在C中实…...
视频外绘技术总结:Be-Your-Outpainter、Follow-Your-Canvas、M3DDM
Diffusion Models专栏文章汇总:入门与实战 前言:视频Inpaint的技术很火,但是OutPaint却热度不高,这篇博客总结比较经典的几篇视频Outpaint技术。其实Outpaint在runway等工具上很火,可是学术界对此关注比较少,博主从这三年的顶会中找到了最具代表性的三篇论文解读。 目录 …...
【硬件测试】基于FPGA的QPSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1QPSK 2.2 帧同步 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法仿真效果 本文是之前写的文章 《基于FPGA的QPSK帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可…...
c++面试:类定义为什么可以放到头文件中
这个问题是刚了解预编译的时候产生的疑惑。 声明是指向编译器告知某个变量、函数或类的存在及其类型,但并不分配实际的存储空间。声明的主要目的是让编译器知道如何解析程序中的符号引用。定义不仅告诉编译器实体的存在,还会为该实体分配存储空间&#…...
PythonFlask框架
文章目录 处理 Get 请求处理 POST 请求应用 app.route(/tpost, methods[POST]) def testp():json_data request.get_json()if json_data:username json_data.get(username)age json_data.get(age)return jsonify({username: username测试,age: age})从 flask 中导入了 Flask…...
Kotlin开发(六):Kotlin 数据类,密封类与枚举类
引言 想象一下,你是个 Kotlin 开发者,敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很?别急,Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode,直接省时省力!再想想需要多种状…...
冬天适合养什么鱼?
各位鱼友们,冬天来了,是不是还在为养什么鱼而烦恼?别担心,今天就来给大家好好推荐一些适合冬天养的鱼,让你的水族箱在寒冷的冬天也能生机勃勃! 一、金鱼:冬日里的“小暖男” 金鱼绝对是冬季养鱼…...
【C++动态规划 状态压缩】2597. 美丽子集的数目|2033
本文涉及知识点 C动态规划 LeetCode2597. 美丽子集的数目 给你一个由正整数组成的数组 nums 和一个 正 整数 k 。 如果 nums 的子集中,任意两个整数的绝对差均不等于 k ,则认为该子数组是一个 美丽 子集。 返回数组 nums 中 非空 且 美丽 的子集数目。…...
前端-Rollup
Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式,而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…...
20【变量的深度理解】
一说起变量,懂点编程的都知道,但是在理解上可能还不够深 变量就是存储空间,电脑上的存储空间有永久(硬盘)和临时(内存条)两种,永久数据重启电脑后依旧存在,临时数据只…...
大数据学习之Kafka消息队列、Spark分布式计算框架一
Kafka消息队列 章节一.kafka入门 4.kafka入门_消息队列两种模式 5.kafka入门_架构相关名词 Kafka 入门 _ 架构相关名词 事件 记录了世界或您的业务中 “ 发生了某事 ” 的事实。在文档中 也称为记录或消息。当您向 Kafka 读取或写入数据时,您以事件的 形式执行…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
