以下代码计算 2 而不是 4:
Regex.Matches("020202020", "020").Count;
我猜正则表达式从上一场比赛结束开始寻找下一场比赛。有什么办法可以防止这种情况。我有一串'0'和'2',我试图计算我有多少次连续三个'2',连续四个'2'等等。
这将按4
您的预期返回:
Regex.Matches("020202020", @"0(?=20)").Count;
前瞻匹配不消耗20
它,因此下一次匹配尝试从第一个 之后的位置开始。您甚至可以将整个正则表达式作为前瞻:0
Regex.Matches("020202020", @"(?=020)").Count;
每次进行零长度匹配时,正则表达式引擎都会自动向前移动一个位置。因此,要查找所有 32
或 42
的运行,您可以使用:
Regex.Matches("22222222", @"(?=222)").Count; // 6
...和:
Regex.Matches("22222222", @"(?=2222)").Count; // 5
编辑:再次查看您的问题,我突然想到您可能正在寻找' 2
s 穿插0
Regex.Matches("020202020", @"(?=20202)").Count; // 2
0
如果你不知道会有多少's,你可以使用这个:
Regex.Matches("020202020", @"(?=20*20*2)").Count; // 2
当然,您可以使用量词来减少正则表达式中的重复:
Regex.Matches("020202020", @"(?=2(?:0*2){2})").Count; // 2
事实上,正则表达式将从最后一个结束的地方继续。您可以通过使用前瞻模式来解决它。我不是 .NET 人,但试试这个:"(?=020)."
翻译:“找到我任何一个字符,这个字符和接下来的两个字符是020
”。诀窍是匹配只有一个字符宽,而不是三个,所以你会得到字符串中的所有匹配,即使它们重叠。
(你也可以把它写成"0(?=20)"
,但至少人类不太清楚:p)
试试这个,使用零宽度正向向后看:
Regex.Matches("020202020",@"(?<=020)").Count;
为我工作,产生 4 场比赛。
我最喜欢的正则表达式参考:正则表达式语言 - 快速参考 也是一种快速尝试正则表达式的方法,我经常将它用于复杂的正则表达式:免费正则表达式设计器
假设您确实在寻找连续2
-s 的序列,还有另一种选择,根本不使用前瞻。(这不适用于查找 和 模式的任意序列0
。2
)
枚举所有出现的三个或更多 -s 的非重叠序列2
(如何?),然后推断较短子序列的数量。
例如,如果你找到一个包含六个连续2
-s 的序列和五个连续2
-s 之一,那么你知道你必须有 (6-3+1) + (5-3+1) = ? 三个连续2
-s 的序列(可能重叠),依此类推:
0002222220000002222200
222
222
222
222
222
222
222
对于大字符串,这应该比使用前瞻要快一些。
因为源包含您的正则表达式模式匹配的两个“020”模式。尝试将您的来源更改为:
Regex.Matches("020202020", "02").Count;
现在它将连续匹配 02,这次你将得到四个。