直接来自这个 java API (ctrl + f) +“组名”:
与组关联的捕获输入始终是该组最近匹配的子序列。如果由于量化而对组进行第二次评估,则如果第二次评估失败,则将保留其先前捕获的值(如果有)。例如,将字符串“aba”与表达式 (a(b)?)+ 匹配,将第二组设置为“b”。所有捕获的输入在每次匹配开始时都会被丢弃。
我知道捕获组如何工作以及它们如何与反向引用一起工作。但是,我没有得到上面引用的 API 位的意义。换句话说,有人能把它放下吗?
提前致谢。
直接来自这个 java API (ctrl + f) +“组名”:
与组关联的捕获输入始终是该组最近匹配的子序列。如果由于量化而对组进行第二次评估,则如果第二次评估失败,则将保留其先前捕获的值(如果有)。例如,将字符串“aba”与表达式 (a(b)?)+ 匹配,将第二组设置为“b”。所有捕获的输入在每次匹配开始时都会被丢弃。
我知道捕获组如何工作以及它们如何与反向引用一起工作。但是,我没有得到上面引用的 API 位的意义。换句话说,有人能把它放下吗?
提前致谢。
那句话说:
如果您+, *, ? 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"
, 未覆盖。
在这种情况下,是否命名捕获无关紧要。
考虑这个输入文本:
foo-bar-baz
这个正则表达式:
[a-z]+(-[a-z]+)*
现在的问题是第 1 组捕获了什么?
随着正则表达式在文本中的进行,它首先匹配-bar
的是第 1 组的内容;但随后它在文本中继续,并识别出现在-baz
是第 1 组的新内容。
因此,-bar
“丢失”:正则表达式引擎已将其丢弃,因为输入中的其他文本与捕获组匹配。这就是这个意思:
[t]他捕获的与组关联的输入始终是该组最近匹配的子序列[强调我的]