正则验证需平衡准确性、可维护性与业务需求:手机号应枚举有效号段并清理空格横线;邮箱用简洁正则+mx校验;身份证须结合正则粗筛与加权校验码计算。

直接用正则验证邮箱、手机号、身份证,关键不是“写得越长越准”,而是平衡准确性、可维护性和实际业务需求。光靠正则无法覆盖全部合法场景(比如国际化邮箱或带校验逻辑的身份证),但它是第一道高效过滤防线。
手机号:别只认“1开头+11位数字”
简单写 ^1[3-9]\d{9}$ 会放过已停用号段(如部分142/143)、漏掉新号段(如192/198),也拦不住带空格或横线的输入(如“138-1234-5678”)。更稳妥的做法是:
- 用明确号段枚举式正则:
^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$,它排除了已废弃的42/43/47等虚拟号段,覆盖当前主流运营商真实号段 - 校验前先清理输入:用
.replace(/\s|-/g, '')去掉空格和横线,再走正则 - 末尾必须加
$,否则“13812345678abc”也会通过
邮箱:够用就好,别追求RFC全兼容
RFC 5322 规范的邮箱正则有上千字符,实际项目中根本不需要。业务真正要拦截的是明显非法格式,比如无@、双@、@后无点、域名为空。推荐这个简洁可靠的版本:
手机号卡联盟系统源码是一套面向手机卡、号卡推广分销业务的联盟型平台程序,底层对接号卡极团供货体系,可将运营商号卡产品直接接入自有平台进行展示与推广,适合做号卡代理、推广分润与多商户联盟运营的场景。系统支持源码部署,采用开源形式并附带正版授权,可在线更新。
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$-
+确保本地部分至少一个字符,避免@domain.com误通过 -
{2,}过滤单字母后缀(如user@x.c),但注意:国际化域名(含中文)需先转 Punycode 再校验 - 正则只是前端第一关,后端发信前必须查 DNS MX 记录或做 SMTP 探测
身份证:正则只能粗筛,校验码必须算
只用 ^\d{17}[\dXx]$ 是严重漏洞——它不验证出生日期是否真实、地区码是否存在、最后一位校验码是否正确。完整流程分两步:
- 先正则粗筛:
^\d{17}[\dXx]$快速排除长度不对或格式明显错误的输入 - 再做加权校验:取前17位数字,分别乘权重数组
[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2],求和后对11取模,余数对应校验码表"10X98765432"(余0→'1',余2→'X') - 额外建议:前6位行政区划码应查公安部公开代码表,可加载为内存字典,避免每次查库
三个校验都别盲目加 RegexOptions.Compiled——启动慢、内存高,只在高频日志解析等场景才值得。普通表单提交,用 Regex.IsMatch(input, pattern) 就足够。










