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. 捕获组不存在时抛出异常

    • 如果指定的捕获组编号或名称不存在,会抛出 IndexOutOfBoundsExceptionIllegalArgumentException
  4. 命名捕获组需要 Java 7+

    • 命名捕获组功能在 Java 7 及以上版本中支持。

6. 完整示例

以下是一个完整的示例,演示如何使用 group() 方法提取捕获组:

java 复制代码
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()
匹配范围 整个字符串必须完全匹配正则表达式。 字符串中只要包含匹配的子串即可。
返回值 truefalse truefalse
多次调用 每次调用都检查整个字符串。 每次调用查找下一个匹配的子串。
适用场景 验证字符串是否符合某种格式。 提取字符串中符合某种模式的子串。
相关推荐
Scott9999HH2 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大7 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说8 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json