当前位置: 首页 > news >正文

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() 方法的使用步骤

  1. 编译正则表达式

    Pattern pattern = Pattern.compile("(\\d{2})-(\\d{2})-(\\d{4})");
  2. 创建 Matcher 对象

    Matcher matcher = pattern.matcher("12-31-2023");
  3. 执行匹配

    • 使用 find() 方法查找匹配项。

    • 或者使用 matches() 方法检查整个字符串是否匹配。

  4. 提取捕获组

    • 使用 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. 注意事项

  1. 匹配成功后才能调用 group()

    • 在调用 group() 之前,必须先调用 find() 或 matches() 方法,否则会抛出 IllegalStateException

  2. 捕获组编号从 1 开始

    • group(0) 表示整个匹配的字符串,group(1) 表示第一个捕获组,依此类推。

  3. 捕获组不存在时抛出异常

    • 如果指定的捕获组编号或名称不存在,会抛出 IndexOutOfBoundsException 或 IllegalArgumentException

  4. 命名捕获组需要 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 或 falsetrue 或 false
多次调用每次调用都检查整个字符串。每次调用查找下一个匹配的子串。
适用场景验证字符串是否符合某种格式。提取字符串中符合某种模式的子串。

相关文章:

java 正则表达式匹配Matcher 类

Matcher 类 用法 在 Java 中&#xff0c;Matcher 类是用于匹配正则表达式的工具&#xff0c;而 group() 方法是 Matcher 类中的一个重要方法&#xff0c;用于提取匹配结果中的捕获组&#xff08;captured groups&#xff09;。以下是对 group() 方法的详细解释&#xff1a; 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(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…...

使用 concurrently 实现前后端一键启动

使用 concurrently 实现前后端一键启动 本文适合&#xff1a; 前后端分离项目&#xff08;如 React Node.js&#xff09;&#xff0c;希望通过一条命令同时启动前端和后端服务。 工具链&#xff1a; Node.js、npm、concurrently。 耗时&#xff1a; 3 分钟。 文章目录 使用 c…...

常见端口的攻击思路

端口号端口说明攻击方向21/22/69FTP/TFTP文件传输协议匿名上传/下载、嗅探、爆破2049NFS服务配置不当139Sanba服务爆破、远程代码执行389Ldap目录访问协议注入、匿名访问、弱口令22SSH远程连接爆破、SSH映射隧道搭建、文件传输23Telnet远程连接爆破、嗅探、弱口令3389RDP远程桌…...

大数据治理实战:架构、方法与最佳实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 大数据治理是确保数据质量、合规性和安全性的重要手段&#xff0c;尤其在数据驱动决策和人工智能应用日益普及的背景下&…...

忘记宝塔的访问地址怎么找

在linux中安装宝塔面板后会生成网址、账号和密码 如果网址忘记了那将进不去宝塔面板该怎么办呢&#xff1f; bt命令 我们输入 bt 命令的时候&#xff0c;是在根目录里面进行操作的。 / bt 我们根据自己的需要&#xff0c;选择对应的数字就可以了。 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脚本是一种用于自动化任务的编程语言&#xff0c;它可以在Unix/Linux操作系统上运行。在这个脚本中&#xff0c;我们将使用一个for循环来遍历目标目录下的所有文件&#xff0c;并使用mv命令将每个文件…...

组合模式 - 组合模式的实现

引言 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象&#xff0c;从而简化了代码的复杂性。本文将详细介绍如何在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++面试:类定义为什么可以放到头文件中

这个问题是刚了解预编译的时候产生的疑惑。 声明是指向编译器告知某个变量、函数或类的存在及其类型&#xff0c;但并不分配实际的存储空间。声明的主要目的是让编译器知道如何解析程序中的符号引用。定义不仅告诉编译器实体的存在&#xff0c;还会为该实体分配存储空间&#…...

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 数据类,密封类与枚举类

引言 想象一下&#xff0c;你是个 Kotlin 开发者&#xff0c;敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很&#xff1f;别急&#xff0c;Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode&#xff0c;直接省时省力&#xff01;再想想需要多种状…...

冬天适合养什么鱼?

各位鱼友们&#xff0c;冬天来了&#xff0c;是不是还在为养什么鱼而烦恼&#xff1f;别担心&#xff0c;今天就来给大家好好推荐一些适合冬天养的鱼&#xff0c;让你的水族箱在寒冷的冬天也能生机勃勃&#xff01; 一、金鱼&#xff1a;冬日里的“小暖男” 金鱼绝对是冬季养鱼…...

【C++动态规划 状态压缩】2597. 美丽子集的数目|2033

本文涉及知识点 C动态规划 LeetCode2597. 美丽子集的数目 给你一个由正整数组成的数组 nums 和一个 正 整数 k 。 如果 nums 的子集中&#xff0c;任意两个整数的绝对差均不等于 k &#xff0c;则认为该子数组是一个 美丽 子集。 返回数组 nums 中 非空 且 美丽 的子集数目。…...

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…...

20【变量的深度理解】

一说起变量&#xff0c;懂点编程的都知道&#xff0c;但是在理解上可能还不够深 变量就是存储空间&#xff0c;电脑上的存储空间有永久&#xff08;硬盘&#xff09;和临时&#xff08;内存条&#xff09;两种&#xff0c;永久数据重启电脑后依旧存在&#xff0c;临时数据只…...

大数据学习之Kafka消息队列、Spark分布式计算框架一

Kafka消息队列 章节一.kafka入门 4.kafka入门_消息队列两种模式 5.kafka入门_架构相关名词 Kafka 入门 _ 架构相关名词 事件 记录了世界或您的业务中 “ 发生了某事 ” 的事实。在文档中 也称为记录或消息。当您向 Kafka 读取或写入数据时&#xff0c;您以事件的 形式执行…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...