如何从Java正则表达式匹配分组中获取对应匹配值?
解决正则多分组只取匹配值的问题
嘿,这个场景我太熟悉了!你的正则用了分支|,两个分组分别对应两种日期格式,匹配时只有其中一个分组会有有效值,另一个肯定是null。这里有两种简单的方法可以拿到你想要的那个分组值:
方法1:遍历所有分组,找到非null的结果
因为你的正则只有两个捕获分组,我们可以直接循环检查每个分组是否不为null,找到就取出来:
final String regex = "^(\\d{1,2}-\\d{1,2}-\\d{4})|(\\d{4}-\\d{1,2}-\\d{1,2})$"; final Pattern pattern = Pattern.compile(regex); final Matcher matcher = pattern.matcher("1988-02-02"); if (matcher.find()) { String matchedValue = null; // 从1开始遍历分组(索引0是整个匹配的字符串) for (int i = 1; i <= matcher.groupCount(); i++) { if (matcher.group(i) != null) { matchedValue = matcher.group(i); break; } } System.out.println("匹配到的分组值:" + matchedValue); // 输出1988-02-02 }
这种方法的好处是不管你有多少个分支分组,都能通用,不用硬编码分组索引。
方法2:使用命名分组,让代码更易读
如果想让代码逻辑更清晰,避免记分组索引的麻烦,可以给每个分组起个名字,之后直接通过名字获取:
final String regex = "^(?<usFormat>\\d{1,2}-\\d{1,2}-\\d{4})|(?<isoFormat>\\d{4}-\\d{1,2}-\\d{1,2})$"; final Pattern pattern = Pattern.compile(regex); final Matcher matcher = pattern.matcher("1988-02-02"); if (matcher.find()) { String matchedValue = matcher.group("isoFormat"); // 如果ISO格式没匹配到,就取美式格式 if (matchedValue == null) { matchedValue = matcher.group("usFormat"); } System.out.println("匹配到的分组值:" + matchedValue); // 输出1988-02-02 }
命名分组的优势在于可读性强,别人看代码一眼就知道每个分组对应什么格式,后期维护也更方便。
补充说明
为什么会出现只有一个分组有值的情况?因为正则的|是分支选择,匹配时只会走其中一个分支路径,所以另一个分支对应的分组自然就没有匹配内容,返回null。我们只需要找到那个有值的分组就行啦~
内容的提问来源于stack exchange,提问作者Aditya D
相关产品推荐
相关产品推荐

