直接来自这个java API(ctrl + f)+“组名”:
与组关联的捕获输入始终是子序列 该组最近匹配。如果一组被评估一秒 时间因为量化然后是先前捕获的值,如果 如果第二次评估失败,将保留任何。匹配 字符串“aba”对表达式(a(b)?)+,例如,离开 第二组设为“b”。所有捕获的输入在开始时被丢弃 每场比赛。
我知道捕获组如何工作以及它们如何使用反向引用。 但是我没有得到上面引用的API位的观点。换句话说,有人能说出来吗?
提前致谢。
答案 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]他捕获与群组相关的输入始终是群组最近匹配的子序列 [强调我的]