空匹配后的下一个匹配

更新:2007 年 11 月

当字符串中重复出现某个匹配项时,正则表达式引擎可通过调用 NextMatch 或使用由 Regex.Matches 返回的集合对空匹配进行特殊处理。

通常,NextMatch 在上一个匹配正好停止的地方开始下一个匹配。不过,在一个空匹配后,NextMatch 前进一个额外的字符,然后尝试下一个匹配。此规则确保匹配引擎在整个字符串中将匹配进行下去。(如果它没有前进一个额外字符,则下一个匹配将就在前一个匹配的同一个位置开始,并且它将重复匹配同一个空字符串。)

例如,对字符串“abaabb”中“a*”的搜索将返回以下匹配序列。

"a", "", "aa", "", "", ""

下面是从另一个角度说明,即在上下文中:

(a)()b(aa)()b()b()

第一个匹配获得第一个 a。第二个匹配就在第一个匹配结束的地方、第一个 b 前开始;它找到 a 的零个匹配项并返回空字符串。

第三个匹配不是在第二个匹配恰好结束的地方开始,因为第二个匹配返回了空字符串。它是在后面的一个字符开始,即第一个 b 之后。第三个匹配找到 a 的两个匹配项并返回“aa”。

第四个匹配在第三个匹配结束的地方开始,即在第二个 b 之前,并且找到了空字符串。然后第五个匹配在最后一个 b 之前开始并再次找到了空字符串。第六个匹配在最后一个 b 之后开始并且还是找到了空字符串。

请参见

其他资源

.NET Framework 正则表达式