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