字符串提取
1 通过Regex类的Match("要提取的字符串","匹配规则")方式提取第一个匹配的子字符串,返回类型一个是Match类的对象,通过其Value属性得到匹配的结果
注意:做字符串提取时,一般都不加^与$;字符串提取操作只是在原字符串中找到匹配规则的一部分子字符串,匹配规则加^与$就是完全匹配(注意:贪婪模式),除非整个原字符串完全匹配规则,否则都不加^与$进行限定
2 通过Reges类的Matches("要提取的字符串","匹配规则")方法得到所有匹配规则的子字符串,返回类型是一个MatchCollection类型的集合
string str = "中国中央气象台2023年7月31日发布称\"卡努\"加强为8级的强台风级";
//提取所有与年月日有关的字符串
string reg = @"\d+(年|月|日)";
MatchCollection mts = Regex.Matches(str, reg);
foreach (Match mt in mts)
{
Console.WriteLine(mt.Value);
}
Console.ReadKey();
字符串提取组
通过为匹配规则加()实现分组提取(可用于统计分类信息)
通过match.Groups[]来获取提取组;注意:索引为0的第1组存储的是整个匹配字符串,获取的提取组应该从索引1开始
在Regex.Match();与Regex.Matches();方法中都可用于提取组
//读取1.html文件到内存中,包含邮箱地址
string str = File.ReadAllText(@"d:\1.html");
//提取 登陆名 哪个邮箱 .com/.cn ...
string email = @"([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)+";
MatchCollection mts = Regex.Matches(str, email);
#region 提取组
//foreach (Match mt in mts)
//{
// //判断当前 mt的值 是否匹配成功
// if (mt.Success)
// {
// //mt.Groups 获取所有分组结果
// //分组依据看匹配规则中有几个()
// //从mt.Groups[1]算起,用于提取组
// //获取整个匹配结果
// Console.WriteLine(mt.Groups[0]);//zs316@163.com
// //获取登陆名
// Console.WriteLine(mt.Groups[1]);//zs316
// //获取是哪个邮箱
// Console.WriteLine(mt.Groups[2]);//163
// //邮箱后缀
// Console.WriteLine(mt.Groups[3]);//.com
// }
//}
#endregion
//============================================
//声明使用哪个统计总数的变量
int count_163 = 0, count_qq = 0, count_sina = 0, others = 0;
//循环匹配规则获取的结果集合
foreach (Match mt in mts)
{
//判断当前分组属于哪个邮箱
switch (mt.Groups[2].Value)
{
case "163":
count_163++;
break;
case "qq":
count_qq++;
break;
case "sina":
count_sina++;
break;
default:
others++;
break;
}
}
Console.WriteLine("使用163邮箱的共有: {0} 个", count_163);
Console.WriteLine("使用qq邮箱的共有: {0} 个", count_qq);
Console.WriteLine("使用sina邮箱的共有: {0} 个", count_sina);
Console.WriteLine("使用其他邮箱的共有: {0} 个", others);
Console.ReadKey();