1

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

与组关联的捕获输入始终是该组最近匹配的子序列。如果由于量化而对组进行第二次评估,则如果第二次评估失败,则将保留其先前捕获的值(如果有)。例如,将字符串“aba”与表达式 (a(b)?)+ 匹配,将第二组设置为“b”。所有捕获的输入在每次匹配开始时都会被丢弃。

我知道捕获组如何工作以及它们如何与反向引用一起工作。但是,我没有得到上面引用的 API 位的意义。换句话说,有人能把它放下吗?

提前致谢。

4

2 回答 2

2

那句话说:

如果您+, *, ? or {m,n}在捕获组上使用了量词 - ,并且您的组多次匹配,则只有最后一个匹配项与捕获组相关联,并且所有先前的匹配项都将被覆盖。

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

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

`(a(b)?)+`

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

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

因此,最后您的 Capture group 1 将包含"a", 覆盖之前捕获的 group "ab", Capture group 2 将包含"b", 未覆盖。

于 2013-07-12T09:38:50.640 回答
2

在这种情况下,是否命名捕获无关紧要。

考虑这个输入文本:

foo-bar-baz

这个正则表达式:

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

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

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

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

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

于 2013-07-12T09:40:29.340 回答