本文总结了C#开发中高频使用的正则表达式,涵盖数字、字符、密码、邮箱、URL、身份证等场景的验证,同时补充正则核心语法解释,方便开发中直接复用。
一、基础数据验证正则
1. 数字相关
| 验证场景 | 正则表达式 | 说明 |
| 只能输入数字 | ^[0-9]*$ | 匹配0个或多个数字(包含空值) |
| 只能输入n位数字 | ^\\d{n}$ | 例如^\\d{6}$匹配6位数字(如验证码) |
| 至少n位数字 | ^\\d{n,}$ | 例如^\\d{6,}$匹配6位及以上数字 |
| m~n位数字 | ^\\d{m,n}$ | 例如^\\d{6,18}$匹配6-18位数字 |
| 零或非零开头的数字 | `^(0 | [1-9][0-9]*)$` |
| 两位小数的正实数 | ^[0-9]+(\\.[0-9]{2})?$ | 如123、123.45,禁止123.4/123.456 |
| 1~3位小数的正实数 | ^[0-9]+(\\.[0-9]{1,3})?$ | 如123、123.4、123.456 |
| 非零正整数 | ^\\+?[1-9][0-9]*$ | 可带+号(如+123),禁止0/-123 |
| 非零负整数 | ^\\-[1-9][0-9]*$ | 必须以-开头,禁止-0/123 |
2. 字符/字符串相关
| 验证场景 | 正则表达式 | 说明 |
| 固定长度字符 | ^.{3}$ | 匹配任意3个字符(含符号、数字、字母) |
| 仅26个英文字母 | ^[A-Za-z]+$ | 大小写均可,禁止数字/符号 |
| 仅大写英文字母 | ^[A-Z]+$ | 纯大写,如ABC |
| 仅小写英文字母 | ^[a-z]+$ | 纯小写,如abc |
| 数字+字母组合 | ^[A-Za-z0-9]+$ | 禁止特殊符号 |
| 数字+字母+下划线 | ^\\w+$ | 等价于^[A-Za-z0-9_]+$ |
| 仅汉字 | ^[\\u4e00-\\u9fa5]{0,}$ | 匹配0个或多个汉字(支持空值) |
| 不含特殊字符 | [^%&’,;=?$\\x22]+ | 禁止^%&’,;=?$"等字符 |
3. 业务场景验证
| 验证场景 | 正则表达式 | 说明 |
| 密码验证 | ^[a-zA-Z]\\w{5,17}$ | 字母开头,6-18位,仅字母/数字/下划线 |
| Email地址 | ^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$ | 兼容主流邮箱格式(如test@163.com、test+abc@qq.com) |
| URL地址 | ^http://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$ | 匹配HTTP协议的URL,支持参数/路径 |
| 电话号码 | `^(\(\d{3,4}-) | \d{3,4}-)?\d{7,8}$` |
| 身份证号 | `^\d{15} | \d{18}$` |
| 月份(1-12) | `^(0?[1-9] | 1[0-2])$` |
| 日期(1-31) | `^((0?[1-9]) | ((1 |
二、前端输入限制(正则应用)
通过正则限制文本框输入内容(适用于JS/C#前端交互):
// 只能输入中文
onkeyup="value=value.replace(/[^\\u4E00-\\u9FA5]/g,'')"
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\\u4E00-\\u9FA5]/g,''))"
// 只能输入全角字符
onkeyup="value=value.replace(/[^\\uFF00-\\uFFFF]/g,'')"
// 只能输入数字
onkeyup="value=value.replace(/[^\\d]/g,'')"
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\\d]/g,''))"
// 只能输入数字和英文
onkeyup="value=value.replace(/[\\W]/g,'')"
三、正则高级应用示例
1. 提取URL中的文件名
string url = "http://www.9499.net/page1.htm";
string fileName = Regex.Replace(url, @"(.*\\/){0,}([^\\.]+).*", "$2");
Console.WriteLine(fileName); // 输出:page1
2. 计算字符串长度(双字节计2,单字节计1)
public static int GetRealLength(string str)
{
return Regex.Replace(str, @"[^\\x00-\\xff]", "aa").Length;
}
3. 去除字符串首尾空格
public static string TrimStr(string str)
{
return Regex.Replace(str, @"(^\\s*)|(\\s*$)", "");
}
4. IP地址转数值
public static long IP2Value(string ip)
{
Regex reg = new Regex(@"(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)");
if (reg.IsMatch(ip))
{
Match m = reg.Match(ip);
int ip1 = int.Parse(m.Groups[1].Value);
int ip2 = int.Parse(m.Groups[2].Value);
int ip3 = int.Parse(m.Groups[3].Value);
int ip4 = int.Parse(m.Groups[4].Value);
return (long)ip1 * 255 * 255 * 255 + ip2 * 255 * 255 + ip3 * 255 + ip4;
}
throw new ArgumentException("无效的IP地址");
}
四、正则核心语法解释
| 符号 | 含义 | 示例 |
\\ | 转义符 | \\n匹配换行符,\\(匹配左括号 |
^ | 匹配字符串开头 | ^abc匹配以abc开头的字符串 |
$ | 匹配字符串结尾 | abc$匹配以abc结尾的字符串 |
* | 匹配前一个字符0次或多次 | zo*匹配z、zo、zoo |
+ | 匹配前一个字符1次或多次 | zo+匹配zo、zoo,不匹配z |
? | 匹配前一个字符0次或1次 | do(es)?匹配do、does |
{n} | 匹配前一个字符n次 | o{2}匹配food中的两个o |
{n,} | 匹配前一个字符至少n次 | o{2,}匹配foooood中的所有o |
{n,m} | 匹配前一个字符n~m次 | o{1,3}匹配fooooood中的前3个o |
? | 非贪婪匹配(紧跟限制符后) | o+?匹配oooo中的第一个o |
. | 匹配除\\n外的任意字符 | a.b匹配a1b、a*b,不匹配a\nb |
| `x | y` | 匹配x或y |
[xyz] | 匹配集合中的任意字符 | [abc]匹配a、b、c |
[^xyz] | 匹配非集合中的字符 | [^abc]匹配d、1等 |
[a-z] | 匹配指定范围字符 | [a-z]匹配小写字母 |
\\b | 匹配单词边界 | er\\b匹配never中的er,不匹配verb中的er |
\\d | 匹配数字(等价于[0-9]) | \\d{3}匹配3位数字 |
\\D | 匹配非数字(等价于[^0-9]) | - |
\\s | 匹配空白字符(空格/制表符/换行等) | - |
\\S | 匹配非空白字符 | - |
\\w | 匹配字母/数字/下划线(等价于[A-Za-z0-9_]) | - |
\\W | 匹配非单词字符(等价于[^A-Za-z0-9_]) | - |
五、C# 正则使用注意事项
- C#中正则字符串需加
@避免转义(如@"\\d"等价于"\\\\d");
- 匹配中文时需确保编码为
UTF-8/GB2312,避免乱码;
- 身份证18位最后一位可能是
X/x,需调整正则为^\\d{15}|\\d{17}[0-9Xx]$;
- 复杂正则建议拆分,提高可读性和维护性;
- 高频使用的正则可编译为
Regex对象(RegexOptions.Compiled),提升性能。
六、扩展封装(C# 正则工具类)
public static class RegexHelper
{
// 验证是否为数字
public static bool IsNumber(string input) => Regex.IsMatch(input, @"^[0-9]*$");
// 验证邮箱
public static bool IsEmail(string input) => Regex.IsMatch(input, @"^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
// 验证身份证号(15/18位)
public static bool IsIDCard(string input) => Regex.IsMatch(input, @"^\\d{15}|\\d{17}[0-9Xx]$");
// 验证URL
public static bool IsUrl(string input) => Regex.IsMatch(input, @"^http://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$");
// 去除首尾空格
public static string Trim(string input) => Regex.Replace(input, @"(^\\s*)|(\\s*$)", "");
}