在C#的字符串处理场景中,正则表达式是非常实用的工具,而Regex.MatchCollection作为正则匹配结果的容器,能够帮我们一次性获取字符串中所有符合正则规则的子串,避免重复编写匹配逻辑。

Regex.MatchCollection的基本概念
Regex.MatchCollection是System.Text.RegularExpressions命名空间下的一个集合类,它是Regex类执行匹配操作后返回的结果集合。当我们需要获取字符串中所有符合正则表达式的子串时,不能直接使用Regex.Match方法,因为该方法默认只返回第一个匹配结果,这时候就需要用到Regex.Matches方法,它返回的就是一个Regex.MatchCollection实例。
这个集合中的每个元素都是Match类型,每个Match对象对应一个匹配到的子串,我们可以通过遍历这个集合拿到所有的匹配结果。
基本使用步骤
使用Regex.MatchCollection获取所有匹配部分的核心步骤如下:
- 引入System.Text.RegularExpressions命名空间
- 定义需要匹配的正则表达式规则
- 创建Regex实例或者直接使用Regex类的静态方法Matches
- 遍历返回的MatchCollection集合获取每个匹配结果
代码示例演示
下面通过一个具体的例子演示如何提取字符串中所有的数字子串:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
// 待匹配的源字符串
string sourceStr = "用户ID是123,订单号是456789,手机号是13800138000";
// 定义匹配连续数字的正则表达式
string pattern = @"d+";
// 调用Regex.Matches方法获取所有匹配结果,返回MatchCollection
MatchCollection matches = Regex.Matches(sourceStr, pattern);
Console.WriteLine("匹配到的所有数字子串:");
// 遍历MatchCollection集合
foreach (Match match in matches)
{
// 输出每个匹配到的子串
Console.WriteLine(match.Value);
// 也可以获取匹配的起始索引和长度
Console.WriteLine($"起始索引:{match.Index},长度:{match.Length}");
}
}
}
上面的代码中,正则规则d+表示匹配一个或多个连续的数字,Regex.Matches会对源字符串进行全局扫描,把所有符合规则的数字子串都找出来,存放在matches集合中,最后通过遍历集合就能拿到所有结果。
注意事项
正则规则的准确性
MatchCollection的匹配结果完全依赖传入的正则表达式,如果正则规则写得不准确,可能会匹配到不需要的内容或者漏匹配。比如如果需要匹配的是固定长度的手机号,就不能只用d+,需要调整为更精准的规则。
性能相关说明
如果需要对大量字符串做相同的正则匹配,建议先创建Regex实例,并且设置合适的正则选项,避免每次匹配都重新编译正则表达式,提升执行效率。例如:
// 创建Regex实例,设置忽略大小写和编译正则的选项 Regex regex = new Regex(@"d+", RegexOptions.IgnoreCase | RegexOptions.Compiled); MatchCollection matches = regex.Matches(sourceStr);
空结果的处理
如果源字符串中没有符合正则规则的内容,Regex.Matches返回的MatchCollection集合的Count属性会是0,遍历的时候不会执行循环体,不需要额外做空判断,但是如果需要后续使用匹配结果,最好先判断集合的Count是否大于0。
常见使用场景
Regex.MatchCollection的使用场景非常广泛,比如:
- 从日志文本中提取所有的错误码
- 从网页源码中提取所有的链接地址
- 从用户输入中校验并提取所有的邮箱地址
- 从配置文本中提取所有的键值对内容
只要是需要从字符串中提取多个符合相同规则子串的场景,都可以优先考虑使用Regex.MatchCollection来实现,代码简洁且逻辑清晰。
C#Regex.MatchCollection正则表达式字符串匹配修改时间:2026-07-20 01:57:20