关于正则表达式捕获组的澄清

时间:2013-07-12 09:25:22

标签: java regex capturing-group

直接来自这个java API(ctrl + f)+“组名”:

  

与组关联的捕获输入始终是子序列   该组最近匹配。如果一组被评估一秒   时间因为量化然后是先前捕获的值,如果   如果第二次评估失败,将保留任何。匹配   字符串“aba”对表达式(a(b)?)+,例如,离开   第二组设为“b”。所有捕获的输入在开始时被丢弃   每场比赛。

我知道捕获组如何工作以及它们如何使用反向引用。 但是我没有得到上面引用的API位的观点。换句话说,有人能说出来吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

那句话说:

如果您在捕获组中使用了量词 - +, *, ? or {m,n},并且您的群组不止一次匹配,那么只有最后一场比赛会与捕获群体相关联,之前的所有匹配都将是重写的。

例如:如果您将(a)+与字符串"aaaaaa"匹配,则捕获组1 将引用最后一个a

现在考虑一下这种情况,你有一个嵌套的捕获组,如你的引用中所示的例子:

`(a(b)?)+`

将此正则表达式与字符串 - "aba"匹配,您将得到以下2个匹配项:

  • "ab" - 捕获组1 = "ab"(由于外括号),捕获组2 = "b"(由于内括号)
  • "a" - 捕获组1 = "a",捕获组2 =无。 (这是因为第二个捕获组(b)?是可选的。因此,它成功匹配最后一个a

因此,最后,您的Capture组1将包含"a",其将覆盖之前捕获的组"ab",而Capture组2将包含"b",但不会覆盖。

答案 1 :(得分:2)

在这种情况下,命名捕获与否无关。

考虑这个输入文本:

foo-bar-baz

和这个正则表达式:

[a-z]+(-[a-z]+)*

现在问题是第1组捕获了什么?

当正则表达式通过文本进行时,它首先匹配-bar,然后匹配组1的内容;但随后它继续在文本中识别-baz,它现在是组1的新内容。

因此,-bar“丢失”:正则表达式引擎已将其丢弃,因为输入中的其他文本与捕获组匹配。这就是这个意思:

  

[t]他捕获与群组相关的输入始终是群组最近匹配的子序列 [强调我的]