在 Java 中,**正则分组(Group)**是通过 小括号 () 来实现的,配合 java.util.regex 包中的 Pattern 和 Matcher 使用。下面从基础到常见用法系统讲一下。
分组就是把正则表达式的一部分括起来,表示一个“子表达式”,可以:
示例:
(\d{4})-(\d{2})-(\d{2})
这里有 3 个分组:
Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher matcher = pattern.matcher("日期是 2024-01-21 和 2023-12-31");
while (matcher.find()) {
System.out.println("整体匹配:" + matcher.group(0));
System.out.println("年:" + matcher.group(1));
System.out.println("月:" + matcher.group(2));
System.out.println("日:" + matcher.group(3));
}
输出:
整体匹配:2024-01-21
年:2024
月:01
日:21
| 写法 | 含义 |
|---|---|
group(0) |
整个正则匹配的内容 |
group(1) |
第 1 个 () |
group(2) |
第 2 个 () |
| … | 以此类推 |
⚠️ 从左到右、从外到内 数括号
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
Pattern pattern = Pattern.compile("(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})");
Matcher matcher = pattern.matcher("2024-01-21");
if (matcher.find()) {
System.out.println(matcher.group("year"));
System.out.println(matcher.group("month"));
System.out.println(matcher.group("day"));
}
✅ 可读性强,避免数括号
(?:)如果你只想分组但不想捕获:
(?:\d{4})-(\d{2})-(\d{2})
此时:
(?:\d{4}) 不参与分组编号(\d{2}) 是 group(1)✅ 常用于性能优化或逻辑分组
(\d)\1
表示:同一个数字重复两次
示例:
Pattern.compile("(\\d)\\1").matcher("11 22 33").find();
(?<num>\d)\k<num>
String regex = "(?<key>[^=]+)=(?<value>[^&]+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("a=1&b=2");
while (matcher.find()) {
System.out.println(matcher.group("key") + " => " + matcher.group("value"));
}
Pattern pattern = Pattern.compile("1([3-9])\\d{9}");
Matcher matcher = pattern.matcher("手机号是13800000000");
if (matcher.find()) {
System.out.println(matcher.group(0));
}
❌ 忘记转义反斜杠
"\\d" // 正确
"\d" // 错误
❌ group() 前没调用 find() / matches()
❌ 混淆 group(0) 和 group(1)
| 功能 | 写法 |
|---|---|
| 普通分组 | (abc) |
| 命名分组 | (?<name>abc) |
| 非捕获分组 | (?:abc) |
| 反向引用 | \1 或 \k<name> |
| 获取分组 | matcher.group(n) |
如果你有具体场景(比如解析日志、校验密码、提取 HTML),可以直接贴出来,我可以帮你写完整正则和 Java 代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。