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
相关产品推荐
相关产品推荐

