You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则提取字符串重复分组内容仅得最后项的问题咨询

解决Java正则捕获重复分组只返回最后匹配项的问题

这个问题我之前也碰到过!原因是重复捕获组的特性——当你给一个分组加上*或者+这类重复量词时,正则引擎只会保留最后一次匹配到的内容,前面的匹配结果都会被覆盖掉,这就是为什么你只拿到了最后一个:08,而不是预期的:11:08。

解决思路1:直接捕获完整的重复片段

把重复的:\d+整体包裹在一个分组里,让量词作用于整个外层分组,这样就能捕获到所有重复的内容。修改后的正则表达式如下:

^s(\d+)e(\d+)((:\d+)+)$

对应的Java代码:

public static void main(String args[]) {
    String marker = "s01e04:11:08";
    Pattern r = Pattern.compile("^s(\\d+)e(\\d+)((:\\d+)+)$");
    Matcher matcher = r.matcher(marker);
    if (matcher.find()) {
        System.out.println(matcher.group(3)); // 输出 :11:08
    }
}

解决思路2:单独捕获每个重复片段(按需拆分)

如果你需要分别获取每个:\d+的部分(比如单独拿到:11和:08),可以用非捕获组包裹重复逻辑,然后通过循环find()方法来遍历所有匹配项:

public static void main(String args[]) {
    String marker = "s01e04:11:08";
    // 直接匹配所有符合:\d+格式的片段
    Pattern r = Pattern.compile("(:\\d+)");
    Matcher matcher = r.matcher(marker);
    
    // 逐个输出每个片段
    while (matcher.find()) {
        System.out.println(matcher.group()); // 依次输出 :11 和 :08
    }
    
    // 如果需要拼接成完整的字符串
    StringBuilder sb = new StringBuilder();
    matcher.reset(); // 重置匹配器,重新开始匹配
    while (matcher.find()) {
        sb.append(matcher.group());
    }
    System.out.println(sb.toString()); // 输出 :11:08
}

第一种方案适合你只需要完整拼接结果的场景,代码最简洁;第二种方案适合需要拆分处理每个时间片段的场景,灵活性更高。

内容的提问来源于stack exchange,提问作者chill appreciator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:46:17