我想计算使用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个匹配。但我似乎找不到计算这个数字的方法。有人可以帮忙吗?
答案 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.MatchRegex.Matches(input, pattern).Cast<Match>().Count();
作为一项规则,我通常会将MatchCollection
返回的Matches
转换为IEnumerable<Match>
,以便与linq一起使用。你可能只是喜欢:
Regex.Matches(input, pattern).Count;