Java正则Matcher分组数量获取错误?如何获取正确分组数?
问题分析与解决
核心原因
Matcher.groupCount()返回的是正则表达式中显式定义的捕获组数量,不包含默认的group(0)(整个匹配的字符串)。你的正则里只有([1-5])这一个捕获组,所以返回1是正确的。- 你的循环从
i=0开始,且条件为i < groupCount(),只会执行i=0的情况,添加的是group(0)(整个匹配串),自然拿不到group(1)的内容。
修正方案
根据需求选择对应的循环逻辑:
1. 获取所有分组(含整个匹配串group(0))
修改循环条件为i <= matcher.groupCount(),覆盖group(0)到所有捕获组:
String debug = "1$<$2"; Matcher matcher = Pattern.compile("^[1-5]" + "\\(?\\$[^\\$]*\\$\\)?" + "([1-5])$").matcher(debug); List<String> matches = new ArrayList<String>(); if (matcher.matches()) { for (var i = 0; i <= matcher.groupCount(); i++){ matches.add(matcher.group(i)); } } System.out.println(matcher.groupCount()); // 输出1 System.out.println(matches); // 输出[1$<$2, 2]
2. 仅获取显式定义的捕获组
循环从i=1开始,到i <= matcher.groupCount()结束:
String debug = "1$<$2"; Matcher matcher = Pattern.compile("^[1-5]" + "\\(?\\$[^\\$]*\\$\\)?" + "([1-5])$").matcher(debug); List<String> matches = new ArrayList<String>(); if (matcher.matches()) { for (var i = 1; i <= matcher.groupCount(); i++){ matches.add(matcher.group(i)); } } System.out.println(matcher.groupCount()); // 输出1 System.out.println(matches); // 输出[2]
额外说明
你的正则中\\(?\\$[^\\$]*\\$\\)?部分的括号是转义后的普通字符,不是捕获组,因此不会被计入groupCount()的统计,这部分逻辑是正常的。
内容的提问来源于stack exchange,提问作者Cositanto
相关产品推荐
相关产品推荐

