C# 用C中的正则表达式计算重叠匹配#

C# 用C中的正则表达式计算重叠匹配#,c#,regex,C#,Regex,以下代码计算的是2而不是4: Regex.Matches("020202020", "020").Count; 我猜正则表达式从上一场比赛结束时开始寻找下一场比赛。有没有办法防止这种情况发生。我有一个由“0”和“2”组成的字符串,我正在尝试计算我有多少次一行有三个“2”,一行有四个“2”,等等。事实上,正则表达式将从最后一个结束的地方继续。您可以通过使用前瞻模式来解决这个问题。我不是一个.NET的家伙,但是试试这个:“(?=020)。”翻译:“给我找一个字符,其中这个字符和后面两个字符是020

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

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”