-
正则表达式——用C#演示邮箱/手机号验证工具
第一部分:C#基础入门
实例11:正则表达式——邮箱/手机号验证工具
实例介绍
正则表达式(Regular Expression,简称Regex)是处理文本匹配、验证、提取的强大工具,它通过简洁的模式字符串描述文本规则,替代繁琐的手动字符串切割/判断逻辑。在实际开发中,格式验证是正则最常见的应用场景——比如用户注册时验证邮箱、手机号是否符合规范。
本实例通过实现一个通用的验证工具类,覆盖邮箱和手机号的核心验证规则,带你掌握正则表达式的基本语法、C#中Regex类的使用方法,理解正则的匹配逻辑,学会在项目中快速编写可靠的文本验证逻辑。
需求分析
1.定义验证规则:
1.邮箱:符合通用格式(如test@example.com),支持用户名含字母/数字/下划线/点/百分号/加号/减号,域名含多级后缀(如test@mail.example.cn);
2.手机号:符合国内手机号规则(1开头,第二位3-9,后续9位数字,如13812345678);
2.编写验证工具:静态类RegexValidator,包含IsValidEmail和IsValidPhoneNumber两个方法;
3.测试覆盖:验证合法/非法输入(如空字符串、缺少@的邮箱、长度不足的手机号);
4.边界处理:处理空值、全角字符、特殊符号等异常输入。
代码实现
csharp
using System;
using System.Text.RegularExpressions;
namespace RegexValidationDemo
{
// ==================== 1. 验证工具类 ====================
/// <summary>
/// 正则表达式验证工具
/// </summary>
public static class RegexValidator
{
// 邮箱正则表达式(通用规则)
private const string EmailPattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$";
// 手机号正则表达式(国内规则)
private const string PhonePattern = @"^1[3-9]d{9}$";
/// <summary>
/// 验证邮箱格式是否合法
/// </summary>
/// <param name="email">待验证的邮箱字符串</param>
/// <returns>合法返回true,否则false</returns>
public static bool IsValidEmail(string email)
{
if (string.IsNullOrWhiteSpace(email))
return false; // 空值直接返回非法
// 使用Regex.IsMatch验证,IgnoreCase忽略域名大小写(如Example.COM和example.com等价)
return Regex.IsMatch(email, EmailPattern, RegexOptions.IgnoreCase);
}
/// <summary>
/// 验证手机号格式是否合法(国内)
/// </summary>
/// <param name="phoneNumber">待验证的手机号字符串</param>
/// <returns>合法返回true,否则false</returns>
public static bool IsValidPhoneNumber(string phoneNumber)
{
if (string.IsNullOrWhiteSpace(phoneNumber))
return false; // 空值直接返回非法
// 手机号严格区分大小写(无字母),无需IgnoreCase
return Regex.IsMatch(phoneNumber, PhonePattern);
}
}
// ==================== 2. 测试程序 ====================
class Program
{
static void Main(string[] args)
{
// 测试邮箱验证
Console.WriteLine("=== 邮箱验证测试 ===");
TestEmail("test@example.com"); // 合法
TestEmail("test.name@example.cn"); // 合法(含点)
TestEmail("test+tag@example.com"); // 合法(含加号)
TestEmail("test@.com"); // 非法(域名开头为点)
TestEmail("testexample.com"); // 非法(无@)
TestEmail(""); // 非法(空)
// 测试手机号验证
Console.WriteLine("
=== 手机号验证测试 ===");
TestPhone("13812345678"); // 合法
TestPhone("19987654321"); // 合法(第二位9)
TestPhone("12812345678"); // 非法(第二位2)
TestPhone("1381234567"); // 非法(长度不足)
TestPhone("138123456789"); // 非法(长度过长)
TestPhone("138-1234-5678"); // 非法(含分隔符)
}
static void TestEmail(string email)
{
bool isValid = RegexValidator.IsValidEmail(email);
Console.WriteLine($"邮箱「{email}」:{(isValid ? "合法" : "非法")}");
}
static void TestPhone(string phone)
{
bool isValid = RegexValidator.IsValidPhoneNumber(phone);
Console.WriteLine($"手机号「{phone}」:{(isValid ? "合法" : "非法")}");
}
}
}
逐行讲解
-
正则表达式定义
邮箱正则(EmailPattern):
csharp
private const string EmailPattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$";
^:匹配字符串开头(确保验证的是整个字符串,而非部分);
[a-zA-Z0-9._%+-]+:用户名部分,允许字母/数字/下划线/点/百分号/加号/减号,+表示至少1个字符;
@:必须包含@符号;
[a-zA-Z0-9.-]+:域名主体部分(如example或mail.example),允许字母/数字/点/减号;
.[a-zA-Z]{2,}:顶级域名(如com/cn),.是转义的点(正则中.表示任意字符),{2,}表示至少2个字母;
$:匹配字符串结尾(确保无多余字符)。
手机号正则(PhonePattern):
csharp
private const string PhonePattern = @"^1[3-9]d{9}$";
^1:开头必须是1;
[3-9]:第二位是3-9之间的数字(国内手机号规则);
d{9}:后续9位数字(d等价于[0-9],{9}表示正好9次);
$:结尾,确保长度正好11位。
-
验证方法实现
IsValidEmail方法:
csharp
public static bool IsValidEmail(string email)
{
if (string.IsNullOrWhiteSpace(email)) return false;
return Regex.IsMatch(email, EmailPattern, RegexOptions.IgnoreCase);
}
空值处理:先用string.IsNullOrWhiteSpace判断vb.net教程C#教程python教程SQL教程access 2010教程
空/空格,直接返回非法;
Regex.IsMatch:静态方法,验证输入字符串是否匹配正则表达式;
RegexOptions.IgnoreCase:忽略大小写(邮箱域名不区分大小写,如Example.COM和example.com等价)。
IsValidPhoneNumber方法:
csharp
public static bool IsValidPhoneNumber(string phoneNumber)
{
if (string.IsNullOrWhiteSpace(phoneNumber)) return false;
return Regex.IsMatch(phoneNumber, PhonePattern);
}
手机号无大小写问题,无需IgnoreCase;
严格匹配11位数字,不允许分隔符(如-或空格)。
3. 测试程序
测试用例覆盖合法和非法场景:
邮箱测试包括含特殊字符(+/.)、无@、域名错误等;
手机号测试包括长度错误、第二位数字错误、含分隔符等;
每个测试用例调用验证方法,输出结果。
基础知识拓展
-
正则核心概念
概念 说明 示例
元字符 具有特殊意义的字符(如^/$/./) ^匹配开头,$匹配结尾
字符集 用[]表示允许的字符范围 [a-z0-9]匹配小写字母和数字
量词 表示字符/组的出现次数(/+/?/{n}) +至少1次,{9}正好9次
转义字符 用转义元字符(如.匹配实际的点) d匹配数字(等价于[0-9])
选项 调整匹配规则(如IgnoreCase忽略大小写,Multiline多行匹配) RegexOptions.IgnoreCase -
C# Regex类常用方法
Regex.IsMatch(string input, string pattern):验证输入是否匹配正则(返回bool);
Regex.Match(string input, string pattern):获取第一个匹配项(返回Match对象);
Regex.Matches(string input, string pattern):获取所有匹配项(返回MatchCollection);
Regex.Replace(string input, string pattern, string replacement):替换匹配的内容;
Regex.Split(string input, string pattern):按匹配的内容分割字符串。
性能优化:频繁使用的正则,建议创建Regex实例并启用Compiled选项(编译正则为IL代码,加快匹配速度):
csharp
private static readonly Regex EmailRegex = new Regex(EmailPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
public static bool IsValidEmail(string email)
{
return !string.IsNullOrWhiteSpace(email) && EmailRegex.IsMatch(email);
}
-
正则的局限性与替代方案
复杂规则:如完全符合RFC标准的邮箱验证(支持国际域名、特殊字符),正则会非常冗长,可考虑使用专门的库(如MailAddress类);
性能问题:嵌套过深的正则可能导致回溯(如(a+)+b匹配长字符串时),需优化正则结构;
可读性:复杂正则可通过RegexOptions.IgnorePatternWhitespace添加注释:
csharp
private const string EmailPatternWithComments = @"
^[a-zA-Z0-9._%+-]+ # 用户名部分
@ # @符号
[a-zA-Z0-9.-]+ # 域名主体
.[a-zA-Z]{2,} # 顶级域名
$ # 结尾
";
private static readonly Regex EmailRegex = new Regex(EmailPatternWithComments, RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);
扩展思考
1.扩展验证类型:如何编写身份证号验证正则?(18位,最后一位可为X);
2.支持分隔符:如何修改手机号正则,允许含-或空格(如138-1234-5678)?
3.提取信息:如何从文本中提取所有手机号?(用Regex.Matches方法);
4.性能对比:手动字符串处理(如判断手机号长度、开头)与正则验证的性能差异?
总结
正则表达式是处理文本验证的高效工具,通过简洁的模式描述复杂规则。本实例通过邮箱和手机号验证,覆盖了正则的核心语法和C#Regex类的使用。在实际项目中,需根据场景选择合适的验证方式:简单规则用正则,复杂规则用专门库,同时注意正则的性能和可读性优化。
掌握正则表达式,能大幅提升文本处理的效率,是后端开发、数据清洗等场景的必备技能。
本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49413.html










