9

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

Regex.Matches("020202020", "020").Count;

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

4

5 回答 5

10

这将按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

编辑:再次查看您的问题,我突然想到您可能正在寻找' 2s 穿插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
于 2012-08-13T22:24:00.230 回答
4

事实上,正则表达式将从最后一个结束的地方继续。您可以通过使用前瞻模式来解决它。我不是 .NET 人,但试试这个:"(?=020)."翻译:“找到我任何一个字符,这个字符和接下来的两个字符是020”。诀窍是匹配只有一个字符宽,而不是三个,所以你会得到字符串中的所有匹配,即使它们重叠。

(你也可以把它写成"0(?=20)",但至少人类不太清楚:p)

于 2012-08-13T22:15:49.843 回答
1

试试这个,使用零宽度正向向后看:

Regex.Matches("020202020",@"(?<=020)").Count;

为我工作,产生 4 场比赛。

我最喜欢的正则表达式参考:正则表达式语言 - 快速参考 也是一种快速尝试正则表达式的方法,我经常将它用于复杂的正则表达式:免费正则表达式设计器

于 2012-08-13T22:22:34.987 回答
0

假设您确实在寻找连续2-s 的序列,还有另一种选择,根本不使用前瞻。(这不适用于查找 和 模式的任意序列02

枚举所有出现的三个或更多 -s 的非重叠序列2(如何?),然后推断较短子序列的数量。

例如,如果你找到一个包含六个连续2-s 的序列和五个连续2-s 之一,那么你知道你必须有 (6-3+1) + (5-3+1) = ? 三个连续2-s 的序列(可能重叠),依此类推:

0002222220000002222200
   222
    222
     222
      222
               222
                222
                 222

对于大字符串,这应该比使用前瞻要快一些。

于 2012-08-13T22:21:03.713 回答
-4

因为源包含您的正则表达式模式匹配的两个“020”模式。尝试将您的来源更改为:

Regex.Matches("020202020", "02").Count;

现在它将连续匹配 02,这次你将得到四个。

于 2012-08-13T22:21:48.657 回答