在C#中能否统计正则表达式各分组的匹配次数?
解决正则表达式分组匹配次数统计的问题
嘿,我来帮你搞定这个统计分组匹配次数的问题!
你遇到的核心问题是:你的正则表达式是三个分支的捕获分组,每次成功匹配只会有其中一个分组捕获到内容,另外两个分组处于未匹配状态。而Matches()方法返回的是所有成功匹配项的总数(也就是三个分支的匹配总和),所以直接拿Count只能得到总次数,没法区分每个分组的具体匹配数。
解决方案:遍历匹配项,检查每个分组的匹配状态
我们可以遍历每个Match对象,通过Groups[索引].Success属性判断当前匹配来自哪个分组,再分别计数。
以下是对应你代码风格的C#示例(推断是.NET环境):
string content = "There are many kids in the playground. It's about 1 23 45 5;中文等等"; // 加@符号避免正则转义问题 Regex characterPattern = new Regex(@"([0-9])|([a-zA-Z])|([一-龥])"); // 初始化三个分组的计数器 int digitCount = 0; int letterCount = 0; int chineseCount = 0; // 遍历所有匹配结果 foreach (Match match in characterPattern.Matches(content)) { // 分组1对应[0-9]规则 if (match.Groups[1].Success) { digitCount++; } // 分组2对应[a-zA-Z]规则 else if (match.Groups[2].Success) { letterCount++; } // 分组3对应[一-龥]规则 else if (match.Groups[3].Success) { chineseCount++; } } // 输出预期结果 Console.WriteLine($"数字匹配次数:{digitCount}"); // 输出:6 Console.WriteLine($"中文匹配次数:{chineseCount}"); // 输出:4 Console.WriteLine($"字母匹配次数:{letterCount}"); // 总匹配数49-6-4=39
关键说明
Groups[0]是整个正则的匹配结果,我们定义的三个捕获分组对应Groups[1]、Groups[2]、Groups[3],顺序和正则里的分组顺序完全一致。- 因为你的三个正则分支是互斥的(一个字符不可能同时是数字、字母和中文),所以每个
Match对象只会有一个分组的Success属性为true,用else if就足够区分。
这样就能精准统计到每个分组的匹配次数,得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者doublnt
相关产品推荐
相关产品推荐

