[转]C# 中的常用正则表达式总结

ChenReal

本文总结了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})?$123123.45,禁止123.4/123.456
1~3位小数的正实数^[0-9]+(\\.[0-9]{1,3})?$123123.4123.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.comtest+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*匹配zzozoo
+匹配前一个字符1次或多次zo+匹配zozoo,不匹配z
?匹配前一个字符0次或1次do(es)?匹配dodoes
{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匹配a1ba*b,不匹配a\nb
`xy`匹配x或y
[xyz]匹配集合中的任意字符[abc]匹配abc
[^xyz]匹配非集合中的字符[^abc]匹配d1
[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# 正则使用注意事项

  1. C#中正则字符串需加@避免转义(如@"\\d"等价于"\\\\d");
  2. 匹配中文时需确保编码为UTF-8/GB2312,避免乱码;
  3. 身份证18位最后一位可能是X/x,需调整正则为^\\d{15}|\\d{17}[0-9Xx]$
  4. 复杂正则建议拆分,提高可读性和维护性;
  5. 高频使用的正则可编译为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*$)", "");
}