获取手机号段网址:https://www.jihaoba.com/tools/haoduan/

先给截止于日期 2021-08-20的结果

String patternPHone="^1((3[0-9])|(4[5-7])|(4[0|9])|(5[0-3])|(5[5-9])|66|(7[5-8])|(7[2|3])|(8[0-9])|(9[5-9])|(9[1|3]))\\d{8}$";
Pattern p = Pattern.compile(patternPHone);
Matcher m = p.matcher("16615987698");
System.out.println(m.matches());

由于手机号段会不断更新,每次自己写难度不大,但是容易有漏的,所以当正则表达式过时时请使用下方Java类生成,其第一步是拿到需要校验的手机号段,这个可以从上方提供的连接地址去获取。再以逗号分割的字符串,替换掉下方程序中参数,执行生成即可。 运行环境 不低于 jdk1.8

ps:像这种验证的正则表达式,过一段时间都会变更,在项目中使用,当三大电信公司的手机号段变更时,能及时变更,且即时生效,最好将其存到缓存技术中,如,redis,没有放到关系性数据库,mysql,oracle中也可以。这样只需要数据运维一下,项目就可以正常使用。

package test;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;import com.sun.xml.internal.ws.util.StringUtils;public class TestPhone {public static void main(String[] args) {String phones="139,138,137,136,134,135,147,150,151,152,157,158,159,172,178,182,183,184,187,188,195,197,198,130,131,132,140,145,146,155,156,166,185,186,175,176,196,133,149,153,177,173,180,181,189,191,193,199";productPhonePattern(phones);String patternPHone=productPhonePatternPLus(phones);Pattern p = Pattern.compile(patternPHone);Matcher m = p.matcher("16615987698");System.out.println(m.matches());}public static String productPhonePattern(String phones) {String[] phonestr =phones.split(",");List<Integer> phoneInteger=new ArrayList<>(); for(String phone:phonestr) {phoneInteger.add(Integer.valueOf(phone));}Map<String,String> map =new HashMap<>();StringBuffer sb =new StringBuffer();phoneInteger.stream().sorted((o1, o2) -> o1-o2)//升序.collect(Collectors.toList()).forEach(phone->{if(map.get(String.valueOf(phone).substring(0,2))==null) {map.put(String.valueOf(phone).substring(0,2), "");if(map.size()>1) {sb.append("])|("+String.valueOf(phone).substring(0,2)+"["+String.valueOf(phone).substring(2));}else {sb.append("("+String.valueOf(phone).substring(0,2)+"["+String.valueOf(phone).substring(2));}}else {sb.append("|"+String.valueOf(phone).substring(2));}});System.out.println("枚举结果,好逊:"+sb.toString()+"])");return sb.toString();} public static String productPhonePatternPLus(String phones) {String[] phonestr =phones.split(",");List<Integer> phoneInteger=new ArrayList<>(); for(String phone:phonestr) {phoneInteger.add(Integer.valueOf(phone));}Map<String,String> map =new HashMap<>();//StringBuffer sb =new StringBuffer();phoneInteger=phoneInteger.stream().distinct()//去重.sorted((o1, o2) -> o1-o2)//升序.collect(Collectors.toList());StringBuffer sb =null;for(int i=0;i<phoneInteger.size();i++ ) {if(map.get(String.valueOf(phoneInteger.get(i)).substring(0,2))==null) {if(map.size()>0) {map.put(String.valueOf(phoneInteger.get(i-1)).substring(0,2), sb.toString());}else {map.put(String.valueOf(phoneInteger.get(i)).substring(0,2), "");}   map.put(String.valueOf(phoneInteger.get(i)).substring(0,2), "");sb =new StringBuffer();sb.append(String.valueOf(phoneInteger.get(i)).substring(2)+",");}else {sb.append(String.valueOf(phoneInteger.get(i)).substring(2)+",");}if(i+1==phoneInteger.size()) {map.put(String.valueOf(phoneInteger.get(i)).substring(0,2), sb.toString());}}StringBuffer sb2 =new StringBuffer();map.forEach((k1,v)->{                    String [] vs=v.split(",");String k=k1.substring(1);if(vs.length==1) {sb2.append("|"+k+v.replace(",","")+"");}else {int count =0;//出现连续的数字的个数int index =0;//记录每一段出现boolean flag =true;//整理连续的for(int i=1;i<vs.length;i++) {if(Integer.valueOf(vs[i])-Integer.valueOf(vs[i-1])==1) {count++;if(flag) {flag=false;index=i-1;}}else {flag=true;if(count>1) {sb2.append("|("+k+"["+vs[index]+"-"+vs[i-1]+"])");for(;index<i;index++) {vs[index]="A";}}count=0;}}if(count>1) {sb2.append("|("+k+"["+vs[index]+"-"+vs[vs.length-1]+"])");for(;index<vs.length;index++) {vs[index]="A";}}//整理不连续的flag =true;for(int i=0;i<vs.length;i++) {if(!"A".equals(vs[i])) {if(flag) {flag =false;sb2.append("|("+k+"[");}sb2.append(vs[i]+"|");}}if(!flag) {sb2.delete(sb2.length()-1,sb2.length());sb2.append("])");}}         });sb2.delete(0, 1);System.out.println("优化的结果的结果:^1("+sb2.toString()+")\\\\d{8}$");return "^1("+sb2.toString()+")\\d{8}$";}
}

运行结果

枚举结果,好逊:(13[0|1|2|3|4|5|6|7|8|9])|(14[0|5|6|7|9])|(15[0|1|2|3|5|6|7|8|9])|(16[6])|(17[2|3|5|6|7|8])|(18[0|1|2|3|4|5|6|7|8|9])|(19[1|3|5|6|7|8|9])
优化的结果的结果:^1((3[0-9])|(4[5-7])|(4[0|9])|(5[0-3])|(5[5-9])|66|(7[5-8])|(7[2|3])|(8[0-9])|(9[5-9])|(9[1|3]))\\d{8}$
true

最新手机号正则表达式,及生成程序相关推荐

  1. 允许为空的手机号正则表达式

    最新手机号正则表达式:^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\D])|(19[^4,\D])|(18[0,1,2,5-9]))\d{8}$ 可以为空的手机号正则 ...

  2. 手机号最新的正则表达式验证(截止2018-03-31)

    转:https://www.jianshu.com/p/18a245600468 /*** 手机号最新的正则表达式验证* * 移动:134-139,147(上网卡),150-152,157-159,1 ...

  3. Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码校验正

    Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码校验正则表达式 ============================== ©Copyright 蕃薯耀 2017年10 ...

  4. Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码正则表达式...

    Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码校验正则表达式 ============================== ©Copyright 蕃薯耀 2017年11 ...

  5. Android最新手机号正则判断(含最新166/198/199开头的手机号)

    Android最新手机号正则判断(含最新166/198/199开头的手机号) /*** 匹配手机号的规则:[3578]是手机号第二位可能出现的数字*/ public static final Stri ...

  6. 最新手机号段归属地数据库(2017年4月16日版)免费下载

    2017年4月16日版   360569条记录 最新 手机号段数据库 号码归属地数据库  移动号段 联通号段 电信号段 14号段 170号段(虚拟运营商)    权威  全面  准确  规范 字段包括 ...

  7. 手机号正则表达式校验,兼容+86,空格和-分隔符等常规手机格式

    手机号正则表达式校验 背景 前一段时间在用蜂巢取快递的时候,我输入199号段,发现提示我手机号错误,导致我无法注册使用蜂巢功能. 最近有空了,打算写一篇关于手机号校验的文章,和大家交流交流.现在网上的 ...

  8. 最新手机号段归属地数据库 2019年6月版 430826条记录

    2019年6月1日版 430826条记录 最新 手机号段数据库 号码归属地数据库 移动号段 联通号段 电信号段 170 171 号段(虚拟运营商) 权威 全面 准确 规范 字段包括 省份 城市 运营商 ...

  9. mysql手机号段地区库_最新手机号段归属地数据库 2019年12月版 441831条记录

    2019年12月1日版 441831条记录 最新 手机号段数据库 号码归属地数据库 移动号段 联通号段 电信号段 170 171 号段(虚拟运营商) 权威 全面 准确 规范 字段包括 省份 城市 运营 ...

最新文章

  1. visual studio asmx 调试_通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序...
  2. 使用joda-time工具类 计算时间相差多少 天,小时,分钟,秒
  3. 开发者福利,BCH通用数据库Bitdb 2.0来了
  4. python保存代码需要删除头部信息吗_用python删除java文件头上版权信息的方法
  5. 计算机文化基础课程总结,计算机文化基础课程总结.docx
  6. java 创建日程到期提醒_日程管理工具—Things 3
  7. dedian系统云服务器,云服务器选择Ubuntu还是Debian镜像系统?根据熟悉度选择
  8. 利用语义分割对木薯根坏死进行评分
  9. Bailian3468 电池的寿命【贪心】
  10. Tencent笔试题收集
  11. java 线程安全集合
  12. 文件传至迅雷服务器,迅雷传输SDK开发文档
  13. 复合型网络拓扑结构图_网络拓扑结构图知识
  14. kotlin写android,Kotlin安卓开发
  15. 网络舆情如何有效预警的方式方法详解
  16. 链表结点的物理顺序与逻辑顺序
  17. HP笔记本win10不能使用U盘,且无安全选项卡解决方法
  18. Win系统 - 单通道 16G 内存 VS 双通道 16G 内存
  19. 中国氯吡脲市场运营分析及项目投资策略建议报告2022-2028年版
  20. 1048. 数字加密(20)

热门文章

  1. 启英泰伦CI-C22GS02(ci1122)单麦离线智能语音模块制作声控小台灯
  2. 数据库Geometry字段操作
  3. MRCTF 2020-“TiKi小组”
  4. ORACLE中RECORD的使用
  5. ubuntu1804 安装PCL
  6. c语言实现动态字符串,C语言怎么实现可变长度字符串
  7. java springMVC demo 事例 注解模式 例子 完整事例
  8. Linux开机出现读秒1min30s的问题
  9. swagger、knif4j访问不了
  10. 吐血整理!14个编写Spring MVC控制器的实用小技巧