直接来自这个java API接口 (ctrl + f) + "Group“:
与组相关联的捕获输入始终是该组最近匹配的子序列。如果一个组由于量化而第二次被评估,那么如果第二个评估失败,它以前捕获的值(如果有的话)将被保留。例如,将字符串"aba“与表达式(a(b)?)+匹配,将第二组设置为"b”。所有捕获的输入都会在每次匹配开始时被丢弃。
我知道捕获组是如何工作的,以及它们是如何使用反向引用的。但是,我没有得到我上面引用的API位的要点。换句话说,有人能把它放下吗?
提前谢谢。
发布于 2013-07-12 09:38:50
这句话说:
如果您在捕获组中使用了量词- +, *, ? or {m,n},并且您的组不止一次匹配,那么只有最后一个匹配将与捕获组相关联,并且所有以前的匹配都将被覆盖。
例如:如果您将(a)+与字符串- "aaaaaa"匹配,则捕获组1将引用最后一个a。
现在考虑一下情况,其中有一个嵌套捕获组,如您的引号中所示的示例:
`(a(b)?)+`将此正则表达式与字符串- "aba"匹配,将得到以下两个匹配项:
"ab" -捕获组1= "ab" (由于外括号),捕获组2="b"(由于内括号)"a" -捕获组1= "a",捕获组2=无。(这是因为第二个捕获组(b)?是可选的。因此,它成功地匹配了最后一个a。最后,捕获组1将包含"a",它覆盖先前捕获的组"ab",捕获组2将包含未被重写的"b"。
发布于 2013-07-12 09:40:29
在这种情况下,命名捕获或不捕获与此无关。
请考虑以下输入案文:
foo-bar-baz而这大政王:
[a-z]+(-[a-z]+)*现在的问题是,第一组捕捉到了什么?
当正则表达式在文本中进行时,它首先与-bar匹配,后者是第1组的内容;然后在文本中继续,并识别-baz,后者现在是第1组的新内容。
因此,-bar“丢失”:正则表达式引擎已经放弃它,因为输入中的更多文本与捕获组匹配。这就是这个意思:
与组相关联的捕获输入始终是该组最近匹配的重点挖掘的子序列。
https://stackoverflow.com/questions/17611645
复制相似问题