1

我有以下字符串:

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 次出现,还是不匹配?

4

3 回答 3

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 组

你现在有:

  • 0 组 1
  • 第 2 组 0 个
  • 第 3 组 0 个
  • 第 4 组 1 个
于 2013-09-18T12:12:11.667 回答
3

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

Pattern.compile("(\\d{1,2}) days (\\d{2}) hour (\\d{2}) min (\\d{2}) sec");
于 2013-09-18T12:12:37.353 回答
0

应该是(\\d{1,2})您将重复运算符排除在组之外。

于 2013-09-18T12:13:38.483 回答