C# 用C中的正则表达式计算重叠匹配#
以下代码计算的是2而不是4:C# 用C中的正则表达式计算重叠匹配#,c#,regex,C#,Regex,以下代码计算的是2而不是4: Regex.Matches("020202020", "020").Count; 我猜正则表达式从上一场比赛结束时开始寻找下一场比赛。有没有办法防止这种情况发生。我有一个由“0”和“2”组成的字符串,我正在尝试计算我有多少次一行有三个“2”,一行有四个“2”,等等。事实上,正则表达式将从最后一个结束的地方继续。您可以通过使用前瞻模式来解决这个问题。我不是一个.NET的家伙,但是试试这个:“(?=020)。”翻译:“给我找一个字符,其中这个字符和后面两个字符是020
Regex.Matches("020202020", "020").Count;
我猜正则表达式从上一场比赛结束时开始寻找下一场比赛。有没有办法防止这种情况发生。我有一个由“0”和“2”组成的字符串,我正在尝试计算我有多少次一行有三个“2”,一行有四个“2”,等等。事实上,正则表达式将从最后一个结束的地方继续。您可以通过使用前瞻模式来解决这个问题。我不是一个.NET的家伙,但是试试这个:
“(?=020)。”
翻译:“给我找一个字符,其中这个字符和后面两个字符是020
”。诀窍在于匹配只有一个字符宽,而不是三个字符宽,因此您将获得字符串中的所有匹配项,即使它们重叠
(您也可以将其写为
“0(?=20)”
,但这至少对人类来说不太清楚:p)假设您确实在寻找连续的2
-s序列,那么还有一个选项根本不使用lookaheads。(这不适用于查找0
和2
模式的任意序列)
列举三个或更多2
-s(如何?)的非重叠序列的所有出现,然后推断较短子序列的数量
例如,如果您找到六个连续2
-s的一个序列和五个连续2
-s的一个序列,那么您知道必须有(6-3+1)+(5-3+1)=?三个连续的2
-s序列(可能重叠),依此类推:
0002222220000002222200
222
222
222
222
222
222
222
对于大字符串,这应该比使用lookaheads快一些。,因为源包含两个与正则表达式模式匹配的“020”模式。尝试将您的源更改为:
Regex.Matches("020202020", "02").Count;
现在它将连续匹配02,这次您将得到四个。尝试使用零宽度正查找:
Regex.Matches("020202020",@"(?<=020)").Count;
Regex.Matches(“02002020”,@)(?这将返回4
,正如您所期望的:
Regex.Matches("020202020", @"0(?=20)").Count;
前瞻匹配20
,而不使用它,因此下一次匹配尝试从第一次0
之后的位置开始。您甚至可以将整个正则表达式作为前瞻:
Regex.Matches("020202020", @"(?=020)").Count;
每次进行零长度匹配时,正则表达式引擎都会自动向前移动一个位置。因此,要查找三次或四次2
,可以使用:
Regex.Matches("22222222", @"(?=222)").Count; // 6
……和:
Regex.Matches("22222222", @"(?=2222)").Count; // 5
编辑:再次查看您的问题,我突然想到,您可能正在寻找穿插着0
的2
Regex.Matches("020202020", @"(?=20202)").Count; // 2
如果您不知道将有多少个0
,您可以使用以下方法:
Regex.Matches("020202020", @"(?=20*20*2)").Count; // 2
当然,您可以使用量词来减少正则表达式中的重复:
Regex.Matches("020202020", @"(?=2(?:0*2){2})").Count; // 2
您的问题具有误导性。您想匹配连续的2
-s还是任意序列?它将为“029029029”
返回相同的结果。查找“02”
并不等同于查找“020”
。