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

 获取手机号段网址: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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值