Java Regexp与匹配的确切数目不匹配

Java Regexp与匹配的确切数目不匹配,java,regex,Java,Regex,我有以下字符串: 0 days 00 hour 20 min 51 sec 我想使用Java的正则表达式从中提取所有数字: Pattern pattern = Pattern.compile("(\\d){1,2} days (\\d){2} hour (\\d){2} min (\\d){2} sec"); Matcher m = pattern.matcher("0 days 00 hour 20 min 51 sec"); 令我惊讶的是m.group(4)返回1而不是51。这同样适用于

我有以下字符串:

0 days 00 hour 20 min 51 sec
我想使用Java的正则表达式从中提取所有数字:

Pattern pattern = Pattern.compile("(\\d){1,2} days (\\d){2} hour (\\d){2} min (\\d){2} sec");
Matcher m = pattern.matcher("0 days 00 hour 20 min 51 sec");
令我惊讶的是
m.group(4)
返回1而不是51。这同样适用于
m.group(2)
,它返回0而不是00


我发现这令人困惑,因为{n}应该与前面表达式的n次匹配,或者不匹配?

您可能希望捕获同一组中的两个数字:

"(\\d{1,2}) days (\\d{2}) hour (\\d{2}) min (\\d{2}) sec"

这就是原始表达式的作用

0 days 00 hour 20 min 51 sec
  • (\d){1,2}
    匹配0,将其放在组1中
  • (\d){2}
    匹配0,将其置于组2中,再次匹配0,将其置于组2中
  • (\d){2}
    匹配2,将其放入组3,匹配0,将其放入组3
  • (\d){2}
    匹配5,将其放入组4,匹配1,将其放入组4
你现在有:

  • 组1中的0
  • 第2组中的0
  • 第3组为0
  • 第4组1名

您可能希望捕获同一组中的两个数字:

"(\\d{1,2}) days (\\d{2}) hour (\\d{2}) min (\\d{2}) sec"

这就是原始表达式的作用

0 days 00 hour 20 min 51 sec
  • (\d){1,2}
    匹配0,将其放在组1中
  • (\d){2}
    匹配0,将其置于组2中,再次匹配0,将其置于组2中
  • (\d){2}
    匹配2,将其放入组3,匹配0,将其放入组3
  • (\d){2}
    匹配5,将其放入组4,匹配1,将其放入组4
你现在有:

  • 组1中的0
  • 第2组中的0
  • 第3组为0
  • 第4组1名

结构
{…}
应该在
(…)
括号内,例如

Pattern.compile("(\\d{1,2}) days (\\d{2}) hour (\\d{2}) min (\\d{2}) sec");

{…}
结构应该在
(…)
括号内,例如

Pattern.compile("(\\d{1,2}) days (\\d{2}) hour (\\d{2}) min (\\d{2}) sec");

应该是
(\\d{1,2})
您将重复操作符从组中删除。

应该是
(\\d{1,2})
您将重复操作符从组中删除。

问题是,当您有重复的捕获组(例如
(abc)*
)时,只有最后一个匹配项将被“保存”。这就是为什么您需要
(\\d{2})
。我觉得这与重复捕获组(例如
(abc)*
)有关,只有最后一个匹配将被“保存”。这就是为什么您需要
(\\d{2})
。我觉得这与