重复捕获组:组号保持不变
由定义的组
(..)是组1。
+量化器重复它。每当引擎能够重复该组(匹配两个字符)时,组1就会被覆盖。
- 引擎开始匹配时,捕获
aa
到组1 - 然后捕获
bb
到组1 - 然后捕获
cc
到组1。
当您检查组1时,引擎将返回
cc。所有其他捕获都将丢失。
(唯一的例外是.NET引擎,它也返回
cc,但也可以让你的中间感谢CaptureCollection对象捕捉检查。这将包括
aa,
bb和
cc)。
使用(..)+(...)
,为什么第1组包含aa
?回溯!
为了理解这一点,我们再次需要遵循正则表达式引擎的路径。
- 再次,当引擎开始匹配时,它捕获
aa
到组1 - 再次,它重复该
(..)
组并捕获bb
到组1 - 再次,它重复该
(..)
组并捕获cc
到组1 - 引擎现在尝试匹配
(...)
。失败:没有字符可消耗。 - 发动机 回溯 无论是在字符串中的正则表达式。在
+
一次或多次,并且我们匹配的手段..
三次,所以我们可以放弃一个,或者甚至是两个。在此阶段,引擎放弃了量化(..)+
组的最后一个匹配,即cc
。我们回到了第1组的时间bb
。 - 引擎
(...)
再次尝试匹配。仅剩两个字符:cc
,因此再次失败。 - 引擎通过放弃量化组的最后一个匹配项()来 回溯 。在这一阶段,第1组再次出现。
(..)+``bb``aa
- 引擎
(...)
再次尝试匹配。成功:组2为bbc
,组1为aa
参考
- 捕获组编号和命名:血腥细节
- 反向引用



