计算正则表达式在字符串中匹配的次数

时间:2014-09-12 11:25:44

标签: c# regex

我想计算使用C#在字符串中匹配正则表达式的次数。我使用此网站来帮助验证我的正则表达式:http://regexpal.com/

我的正则表达式是:

Time(\\tChannel [0-9]* \(mV\))*

这是输入字符串:

Time\tChannel 1 (mV)\tChannel 2 (mV)\tChannel 3 (mV)\tChannel 4 (mV)\tChannel 5 (mV)\tChannel 6 (mV)\tChannel 7 (mV)\tChannel 8 (mV)\tChannel 1_cal (mg/L)\tChannel 2_cal ()\tChannel 3_cal ()\tChannel 4_cal ()\tChannel 5_cal ()\tChannel 6_cal ()\tChannel 7_cal ()\tChannel 8_cal ()\tMotor 1 (mm)\tMotor 2 (mm)

我的期望是,对于我的输入字符串,我的正则表达式应该产生8个匹配。但我似乎找不到计算这个数字的方法。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

对于这种特殊情况,你可以这样做:

Regex.Match(input, pattern).Groups[1].Captures.Count

Groups[0]中的元素将是整个匹配,因此对您所需的内容没有帮助。 Groups[1]将包含整个(\\tChannel [0-9]* \(mV\))*部分,其中包含所有重复部分。要获得重复的次数,请使用.Captures.Count

基于您的示例的示例:

Regex.Match(
    @"Time\tChannel 1 (mV)\tChannel 2 (mV)\tChannel 3 (mV)\tChannel 4 (mV)\tChannel 5 (mV)\tChannel 6 (mV)\tChannel 7 (mV)\tChannel 8 (mV)\tChannel 1_cal (mg/L)\tChannel 2_cal ()\tChannel 3_cal ()\tChannel 4_cal ()\tChannel 5_cal ()\tChannel 6_cal ()\tChannel 7_cal ()\tChannel 8_cal ()\tMotor 1 (mm)\tMotor 2 (mm)", 
    @"Time(\\tChannel [0-9]* \(mV\))*"
).Groups[1].Captures.Count;

我为那里糟糕的格式道歉,但这应该告诉你至少可以做到这一点。

围绕Regex.Matches(...).Count提供的示例在这里不起作用,因为它只是一场比赛。您不能仅使用Regex.Match(...).Groups.Count,因为您只指定了一个组,这使得匹配返回了2个组。您需要查看特定组Regex.Match(...).Groups[1],并从该组中的捕获数量中获取计数。

此外,您可以命名这些组,这些组可能会使发生的事情更加清晰。这是一个例子:

Regex.Match(
    @"Time\tChannel 1 (mV)\tChannel 2 (mV)\tChannel 3 (mV)\tChannel 4 (mV)\tChannel 5 (mV)\tChannel 6 (mV)\tChannel 7 (mV)\tChannel 8 (mV)\tChannel 1_cal (mg/L)\tChannel 2_cal ()\tChannel 3_cal ()\tChannel 4_cal ()\tChannel 5_cal ()\tChannel 6_cal ()\tChannel 7_cal ()\tChannel 8_cal ()\tMotor 1 (mm)\tMotor 2 (mm)", 
    @"Time(?<channelGroup>\\tChannel [0-9]* \(mV\))*"
).Groups["channelGroup"].Captures.Count;

答案 1 :(得分:2)

使用Regex.Matches:

代替Regex.Match
Regex.Matches(input, pattern).Cast<Match>().Count();

作为一项规则,我通常会将MatchCollection返回的Matches转换为IEnumerable<Match>,以便与linq一起使用。你可能只是喜欢:

Regex.Matches(input, pattern).Count;