重复中的正则表达式捕获组

时间:2016-01-04 19:02:25

标签: java regex

我试图从字符串中提取每个整数值。该字符串具有重复的部分,从1到7次。每个部分有4个整数值。

kjlfdiuadfj FOO1:   176 3171    441 FOO2:   164 4499    340 FOO3:   1812    7244    1255    FOO4:   288 5290    771 jkajkdfldj

我正在尝试构建一个正则表达式来唯一标识每个重复节中的每个整数。

(FOO(\d):\s+(\d+)\s+(\d+)\s+(\d+)\s+){1,7}

当我运行此模式时,正则表达式组匹配如下:

1: <The entire original string>
2: 4
3: 288
4: 5290
5: 771

通知组2-5仅匹配最后一次(第4次)重复。为什么前三次重复不匹配?如何从每次重复中提取所有4个整数?

1 个答案:

答案 0 :(得分:1)

  

通知组2-5仅匹配最后一次(第4次)重复。为什么前三次重复不匹配?如何从每次重复中提取所有4个整数?

我相信你会发现第1组也只匹配第四次重复。另一方面,第0组将始终对应于整场比赛 - 我怀疑这就是你所看到的。

the API docs for java.util.regex.Pattern中记录了此行为:

  

捕获组的编号是从左到右计算它们的左括号。

[...]

  

第0组始终代表整个表达式。

[...]

  

与群组关联的捕获输入始终是群组最近匹配的子序列。

这在所有正则表达式实现中都非常标准。

您可以使用与完全一个重复单位对应的模式,通过Matcher.find()和/或Matcher.lookingAt()一次处理一个字符串,而不是一次性捕获所有字符串。 。每次成功匹配后,提取并存储该匹配的捕获组。