在C#中计算与Regex的重叠匹配

Kri*_*son 9 c# regex

以下代码计算2而不是4:

Regex.Matches("020202020", "020").Count;
Run Code Online (Sandbox Code Playgroud)

我猜测正则表达式开始寻找上一场比赛结束时的下一场比赛.有什么办法可以防止这种情况发生.我有一个'0'和'2'字符串,我试图计算连续三次'2'连续多少次,连续四次'2'等等.

Ala*_*ore 9

这将按4预期返回:

Regex.Matches("020202020", @"0(?=20)").Count;
Run Code Online (Sandbox Code Playgroud)

先行匹配20消费,所以下一场比赛尝试在后的第一个位置开始0.您甚至可以将整个正则表达式作为前瞻:

Regex.Matches("020202020", @"(?=020)").Count;
Run Code Online (Sandbox Code Playgroud)

每次进行零长度匹配时,正则表达式引擎会自动向前移动一个位置.因此,要找到三个2或四个2的所有运行,您可以使用:

Regex.Matches("22222222", @"(?=222)").Count;  // 6
Run Code Online (Sandbox Code Playgroud)

...和:

Regex.Matches("22222222", @"(?=2222)").Count;  // 5
Run Code Online (Sandbox Code Playgroud)

编辑:再次回顾你的问题,我发现你可能正在寻找2穿插0的问题

Regex.Matches("020202020", @"(?=20202)").Count;  // 2
Run Code Online (Sandbox Code Playgroud)

如果您不知道0会有多少,您可以使用:

Regex.Matches("020202020", @"(?=20*20*2)").Count;  // 2
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用量词来减少正则表达式中的重复:

Regex.Matches("020202020", @"(?=2(?:0*2){2})").Count;  // 2
Run Code Online (Sandbox Code Playgroud)