依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 18|回复: 0

VC++手机号码验证两种常用写法:正则版和“无正则”的快速版,均适配中国大陆手机号

[复制链接] 主动推送

2万

主题

2万

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
23300
发表于 前天 10:17 | 显示全部楼层 |阅读模式
VC++手机号码验证两种常用写法:正则版和“无正则”的快速版,均适配中国大陆手机号
正则版(C++11)
规则:可带可不带国家码 +86/86,可含空格/短横,核心号段 1[3-9] 开头共 11 位。
  1. #include <regex>
  2. #include <string>

  3. bool IsChinaMobileRegex(const std::string& s)
  4. {
  5.     // 允许前后空白,可选 +86/86,可选分隔,核心为 1[3-9] 后 9 位
  6.     static const std::regex re(
  7.         R"(^\s*(?:\+?86[-\s]?)?1[3-9]\d{9}\s*$)"
  8.     );
  9.     return std::regex_match(s, re);
  10. }
复制代码
无正则快速版(更轻量,性能好)
  • 去掉前后空白
  • 去掉空格和短横
  • 去掉前缀 +86 或 86
  • 核心校验:长度 11,首位为 '1',第二位 '3'~'9',其余全数字
  1. #include <string>
  2. #include <algorithm>
  3. #include <cctype>

  4. static inline void trim(std::string& s) {
  5.     auto notsp = [](int ch){ return !std::isspace(ch); };
  6.     s.erase(s.begin(), std::find_if(s.begin(), s.end(), notsp));
  7.     s.erase(std::find_if(s.rbegin(), s.rend(), notsp).base(), s.end());
  8. }

  9. bool IsChinaMobileFast(std::string s)
  10. {
  11.     trim(s);

  12.     // 去掉分隔符(按需可扩展 '.' 等)
  13.     s.erase(std::remove(s.begin(), s.end(), ' '), s.end());
  14.     s.erase(std::remove(s.begin(), s.end(), '-'), s.end());

  15.     // 去掉可选国家码
  16.     if (s.rfind("+86", 0) == 0) s.erase(0, 3);
  17.     else if (s.rfind("86", 0) == 0) s.erase(0, 2);

  18.     if (s.size() != 11) return false;
  19.     if (s[0] != '1')    return false;
  20.     if (s[1] < '3' || s[1] > '9') return false;

  21.     return std::all_of(s.begin()+2, s.end(),
  22.                        [](unsigned char c){ return std::isdigit(c); });
  23. }
复制代码
CString 适配(MFC/ATL)
  1. #include <atlconv.h> // CT2A

  2. bool IsChinaMobileFast(const CString& cs)
  3. {
  4.     CT2A a(cs);
  5.     return IsChinaMobileFast(std::string(a));
  6. }
  7. // 或用正则版:IsChinaMobileRegex(std::string(a))
复制代码
小提示
  • 更严格的号段细分可用:1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9]) 共 11 位;一般业务用 1[3-9]\d{9} 足够。
  • 如果要拒绝前缀/分隔符,删掉相应的“去前缀/去分隔”代码即可。



只校验“纯11位中国大陆手机号”,不考虑+86、空格或短横。给出两个MFC版函数:一个通用简单规则,另一个更严格按号段判断。都用 CString,Unicode/ANSI 都可编译。
简单版:1[3-9]开头 + 剩余9位数字
  1. #include <atlstr.h>

  2. static inline bool IsDigitW(wchar_t ch) { return ch >= L'0' && ch <= L'9'; }

  3. bool IsCnMobile11_Simple(CString s)
  4. {
  5.     s.Trim();
  6.     if (s.GetLength() != 11) return false;
  7. #ifdef _UNICODE
  8.     const wchar_t* p = s.GetString();
  9. #else
  10.     const char* p = s.GetString();
  11. #endif
  12.     // 全为数字
  13.     for (int i = 0; i < 11; ++i) {
  14. #ifdef _UNICODE
  15.         if (!IsDigitW(p[i])) return false;
  16. #else
  17.         if (p[i] < '0' || p[i] > '9') return false;
  18. #endif
  19.     }
  20.     // 1 开头,第二位 3~9
  21. #ifdef _UNICODE
  22.     if (p[0] != L'1') return false;
  23.     return p[1] >= L'3' && p[1] <= L'9';
  24. #else
  25.     if (p[0] != '1') return false;
  26.     return p[1] >= '3' && p[1] <= '9';
  27. #endif
  28. }
复制代码
严格版:按常见号段细分
  • 13x、18x 全部允许
  • 14[5-9]
  • 15[0-35-9](排除154)
  • 16[2567]
  • 17[0-8]
  • 19[0-35-9](常见做法:排除194)
  1. bool IsCnMobile11_Strict(CString s)
  2. {
  3.     s.Trim();
  4.     if (s.GetLength() != 11) return false;
  5. #ifdef _UNICODE
  6.     const wchar_t* p = s.GetString();
  7.     auto isDigit = [](wchar_t c){ return c >= L'0' && c <= L'9'; };
  8. #else
  9.     const char* p = s.GetString();
  10.     auto isDigit = [](char c){ return c >= '0' && c <= '9'; };
  11. #endif
  12.     for (int i = 0; i < 11; ++i) if (!isDigit(p[i])) return false;

  13. #ifdef _UNICODE
  14.     if (p[0] != L'1') return false;
  15.     wchar_t b1 = p[1], b2 = p[2];
  16. #else
  17.     if (p[0] != '1') return false;
  18.     char b1 = p[1], b2 = p[2];
  19. #endif

  20.     switch (b1) {
  21.     case '3': return true;                      // 130-139
  22.     case '4': return (b2 >= '5' && b2 <= '9');  // 145-149
  23.     case '5': return (b2 != '4');               // 150-159(除154)
  24.     case '6': return (b2=='2'||b2=='5'||b2=='6'||b2=='7'); // 162/165/166/167
  25.     case '7': return (b2 >= '0' && b2 <= '8');  // 170-178
  26.     case '8': return true;                      // 180-189
  27.     case '9': return (b2 != '4');               // 常见做法:190-199(排194)
  28.     default:  return false;
  29.     }
  30. }
复制代码
使用示例
  1. CString phone = _T("13812345678");
  2. if (IsCnMobile11_Strict(phone)) {
  3.     // 合法
  4. } else {
  5.     // 非法
  6. }
复制代码
说明
  • 你只要纯11位数字时,优先用 Strict;若业务只需大范围校验,用 Simple 足够。
  • 若需要进一步按照最新号段调整,只需要修改 switch 中各分支即可。

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-11-17 17:52

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表