在 Java 中,使用 正则表达式捕获分组 主要依赖 java.util.regex 包里的 Pattern 和 Matcher 类。下面从基础到进阶给你讲清楚。
用 小括号 () 括起来的部分就是“捕获分组”,
正则匹配成功后,可以单独拿到每一组的内容。
(\d{4})-(\d{2})-(\d{2})
上面有 3 个捕获分组:
import java.util.regex.*;
public class Test {
public static void main(String[] args) {
String text = "今天是 2024-01-15,明天是 2024-01-16";
String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
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-15
年: 2024
月: 01
日: 15
✅ group(0) 永远是整个匹配
✅ group(n) 是第 n 个捕获分组
Java 7+ 支持 命名捕获分组
(?<name>...)
String regex = "(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("2024-01-15");
if (matcher.find()) {
System.out.println(matcher.group("year"));
System.out.println(matcher.group("month"));
System.out.println(matcher.group("day"));
}
✅ 可读性更好
✅ 不怕分组顺序变化
有时候你只是想“分组”,但 不想捕获:
(?:abc)+
String regex = "(?:\\d{4})-(\\d{2})";
(?:...):非捕获分组group(1) 只匹配月份String text = "a=1; b=2; c=3";
String regex = "(\\w+)=(\\d+)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(1) + " => " + m.group(2));
}
输出:
a => 1
b => 2
c => 3
find() / matches()find():查找子串matches():整个字符串必须匹配Java 字符串中:
"\\d" // 正则里的 \d
matcher.group(5); // 如果没有第5组会抛异常
| 功能 | 写法 |
|---|---|
| 捕获分组 | (...) |
| 命名分组 | (?<name>...) |
| 非捕获分组 | (?:...) |
| 获取分组 | matcher.group(n) |
| 获取命名分组 | matcher.group("name") |
如果你有 具体场景(比如解析日志、URL、JSON 片段、邮箱等),可以把字符串和想要的结果发出来,我可以帮你写正则。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。