Java Regex与确切的匹配数不匹配

时间:2013-09-18 12:10:26

标签: 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.同样适用于m.group(2),它返回0而不是00

我发现这令人困惑,因为{n}应该恰好匹配前面表达式的n次出现,不是吗?

3 个答案:

答案 0 :(得分:4)

您可能想要捕获同一组中的两个数字:

"(\\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

答案 1 :(得分:3)

{...}结构应位于(...)括号内,例如

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

答案 2 :(得分:0)

它应该是(\\d{1,2})你将重复操作员排除在小组之外。