正则表达式
掌握正则表达式核心语法
熟练使用
Regex类进行匹配、提取、替换能实现校验、提取、脱敏等业务场景
核心讲解
(1)Regex 类
命名空间:System.Text.RegularExpressions
校验:
Regex.IsMatch()匹配所有:
Regex.Matches()替换:
Regex.Replace()分割:
Regex.Split()实例:
new Regex(模式),多次使用建议实例化,性能更好
(2)常用语法
字符类:
\d数字、\w字母数字下划线、\s空白、.任意字符量词:
*0 + 次、+1 + 次、?0/1 次、{n}n 次边界:
^开头、$结尾分组:
(),提取用或:
|字符集:
[abc]、[a-z]、[^abc]取反
(3)贪婪与非贪婪
默认贪婪:
*+尽可能多匹配非贪婪:加
?,*?+?,尽可能少匹配,提取内容常用
操作步骤
编写手机号校验
实现文本提取
实现脱敏替换
运行验证
代码示例
using System.Text.RegularExpressions;
string text = "联系电话:13800138000,备用:15912345678,邮箱:admin@test.com,网址:https://www.example.com";
// 1. 校验手机号
string phonePattern = @"^1[3-9]\d{9}$";
Console.WriteLine("手机号校验:" + Regex.IsMatch("13812345678", phonePattern));
// 2. 提取所有手机号
MatchCollection phones = Regex.Matches(text, @"1[3-9]\d{9}");
Console.WriteLine("\n提取的手机号:");
foreach (Match m in phones)
{
Console.WriteLine(m.Value);
}
// 3. 提取邮箱
Match email = Regex.Match(text, @"[\w.-]+@[\w.-]+\.\w+");
Console.WriteLine("\n邮箱:" + email.Value);
// 4. 分组提取
string info = "张三,年龄:25岁,城市:成都";
Match m = Regex.Match(info, @"(.+?),年龄:(\d+)岁,城市:(.+)");
if (m.Success)
{
Console.WriteLine("\n分组提取:");
Console.WriteLine("姓名:" + m.Groups[1].Value);
Console.WriteLine("年龄:" + m.Groups[2].Value);
Console.WriteLine("城市:" + m.Groups[3].Value);
}
// 5. 替换:手机号脱敏
string masked = Regex.Replace(text, @"1[3-9]\d{5}(\d{4})", "*******$1");
Console.WriteLine("\n脱敏后:" + masked);
// 6. 非贪婪匹配提取HTML标签
string html = "<div>标题</div><div>内容</div>";
var tags = Regex.Matches(html, @"<div>(.*?)</div>");
Console.WriteLine("\n非贪婪提取:");
foreach (Match tag in tags)
{
Console.WriteLine(tag.Groups[1].Value);
}
Console.ReadKey();
常见误区
转义问题:C# 字符串里
\要转义,推荐用@""原义字符串IsMatch 和 Match 混淆:IsMatch 只返回 bool,Match 才返回匹配内容
默认贪婪提取内容多:提取标签、内容时用非贪婪,加
?性能问题:大量循环匹配要实例化 Regex,或者用编译好的静态正则
课后练习
写一个邮箱的正则校验
从一段文本中提取所有的 URL 链接
实现:把手机号中间 4 位替换成 ****
说明贪婪匹配和非贪婪匹配的区别

