更新于 - 2019.9.12
直入正题,经过我在工信部和三大运营商官网查找,得到下面正则验证方式:
public class RegexCheck {
/**
* 截止 12/9/19,三大网络运营商在大陆号段分配:
* 移动:134,135,136,137,138,139,144,147,148,150,151,152,157,158,159,172,178,182,183,184,187,188,198;
* 联通:130,131,132,145,146,155,156,166,167,175,176,185,186;
* 电信:133,149,153,173,174,177,180,181,189,191,199;
* 虚拟运营商:170,171;
*
* 数据来源工信部网址:http://www.miit.gov.cn/Searchweb/news.jsp (网页中搜索:《电信网码号资源使用证书》颁发结果)
*
* 大陆手机号码11位数,再结合以上运营商支持号段,得出匹配格式:前三位固定格式 + 后8位任意数,
* 此方法中前三位格式有:
* 13 + (0-9之间任意数)
* 14 + (4/5/6/7/8/9)
* 15 + (0-9之间除4之外任意数)
* 16 + (6/7)
* 17 + (0-9之间除9之外任意数)
* 18 + (0-9之间任意数)
* 19 + (1/8/9)
*/
public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
String regExp = "^((13[0-9])|(14[4-9])|(15[^4])|(16[6-7])|(17[^9])|(18[0-9])|(19[1|8|9]))\\d{8}$";
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(str);
return m.matches();
}
}
需要注意:
【1】工信部一直在更新可用手机号段,如果想要获取更全的手机信息,可以去工信部(或者三大运营商官网)查看。
查看方式:工信部网址:http://www.miit.gov.cn/Searchweb/news.jsp (网页中搜索:《电信网码号资源使用证书》颁发结果)
【2】如上代码所示,在移动端(也即前端)去进行正则验证手机号码的方式不可靠。因为如【1】条所说,工信部在一直更新可用的手机号段,而我们的应用使用了硬编码的方式进行校验,如果应用发版后,工信部(或者三大运营商)更新了自己的手机号段,那我们的应用规则对这些新手机用户就不太友好了(一般会导致手机注册账号失败)。
所以最好的方式是给后台去做号码校验,我们只是校验用户输入的是不是十一位的数字,本地校验通过后,再调用后台接口对号码的合法性做正则检测,毕竟后台数据随时可配置更新。
【3】在不是很严格的情况下,一般我们都会本地做正则校验。。这种情况下,手机号段又会一直更新,需要我们随时更新正则校验方法,所以我们学习一下正则表达式还是很有必要的。
参考:
https://blog.csdn.net/u011415782/article/details/85601655
如果找到了你需要的,可不可以评论一下下~