[转载]JAVA号码工具类:实现手机固话号码判断与区号截取

工具类说明

该工具类主要是用于判断号码的类型,如果是手机类型,则返回号码前7位,便于后面继续判断号码归属地;如果是固话类型,则截取固话的区号,同样也是为了后面判断号码的归属地。
在获取到这些信息之后,在结合号码归属地数据库,就能实现完整的归属地功能了。

注:通过淘宝购买手机归属地数据库也算是一个不错的注意,推荐下!

特点

1、使用正则表达式判断手机、固话,基本满足现有手机固话的规则
2、返回的判断结果封装到一个结果类中,结果类中包括号码类型、号码前缀或区号、号码

正则表达式说明

下面是这次主要用到的这则表达式:

//用于匹配手机号码
private final static String REGEX_MOBILEPHONE = "^0?1[3458]\\d{9}$";

//用于匹配固定电话号码
private final static String REGEX_FIXEDPHONE = "^(010|02\\d|0[3-9]\\d{2})?\\d{6,8}$";

//用于获取固定电话中的区号
private final static String REGEX_ZIPCODE = "^(010|02\\d|0[3-9]\\d{2})\\d{6,8}$";

手机号码规则:匹配的号码是第一个为1,第二位为3458,长度为11的号码,前面可以有0.该规则基本满足现有手机的号段。
固定电话规则:根据现有的区号规则总结归纳出来的,区号规则是010只有一个、02开头的三位数、03到09开头的四位数。同样,区号也是可选的,真实的号码长度在6到8位。

具体代码

001 import java.util.regex.Matcher;
002 import java.util.regex.Pattern;
003  
004 public class NumberUtil {
005     //用于匹配手机号码
006     private final static String REGEX_MOBILEPHONE = "^0?1[3458]\\d{9}$";
007  
008     //用于匹配固定电话号码
009     private final static String REGEX_FIXEDPHONE = "^(010|02\\d|0[3-9]\\d{2})?\\d{6,8}$";
010  
011     //用于获取固定电话中的区号
012     private final static String REGEX_ZIPCODE = "^(010|02\\d|0[3-9]\\d{2})\\d{6,8}$";
013  
014     private static Pattern PATTERN_MOBILEPHONE;
015     private static Pattern PATTERN_FIXEDPHONE;
016     private static Pattern PATTERN_ZIPCODE;
017  
018  
019     static {
020         PATTERN_FIXEDPHONE = Pattern.compile(REGEX_FIXEDPHONE);
021         PATTERN_MOBILEPHONE = Pattern.compile(REGEX_MOBILEPHONE);
022         PATTERN_ZIPCODE = Pattern.compile(REGEX_ZIPCODE);
023     }
024  
025     public static enum PhoneType {
026         /**
027          * 手机
028          */
029         CELLPHONE,
030  
031         /**
032          * 固定电话
033          */
034         FIXEDPHONE,
035  
036         /**
037          * 非法格式号码
038          */
039         INVALIDPHONE
040     }
041  
042     public static class Number {
043         private PhoneType type;
044         /**
045          * 如果是手机号码,则该字段存储的是手机号码 前七位;如果是固定电话,则该字段存储的是区号
046          */
047         private String code;
048         private String number;
049  
050         public Number(PhoneType _type, String _code, String _number) {
051             this.type = _type;
052             this.code = _code;
053             this.number = _number;
054         }
055  
056         public PhoneType getType() {
057             return type;
058         }
059  
060         public String getCode() {
061             return code;
062         }
063  
064         public String getNumber() {
065             return number;
066         }
067  
068         public String toString(){
069             return String.format("[number:%s, type:%s, code:%s]", number, type.name(), code);
070         }
071     }
072  
073     /**
074      * 判断是否为手机号码
075      *
076      * @param number
077      *            手机号码
078      * @return
079      */
080     public static boolean isCellPhone(String number) {
081         Matcher match = PATTERN_MOBILEPHONE.matcher(number);
082         return match.matches();
083     }
084  
085     /**
086      * 判断是否为固定电话号码
087      *
088      * @param number
089      *            固定电话号码
090      * @return
091      */
092     public static boolean isFixedPhone(String number) {
093         Matcher match = PATTERN_FIXEDPHONE.matcher(number);
094         return match.matches();
095     }
096  
097  
098     /**
099      * 获取固定号码号码中的区号
100      *
101      * @param strNumber
102      * @return
103      */
104     public static String getZipFromHomephone(String strNumber) {
105         Matcher matcher = PATTERN_ZIPCODE.matcher(strNumber);
106         if (matcher.find()) {
107             return matcher.group(1);
108         }
109  
110         return null;
111     }
112  
113     /**
114      * 检查号码类型,并获取号码前缀,手机获取前7位,固话获取区号
115      * @param number
116      * @return
117      */
118     public static Number checkNumber(String _number){
119         String number = _number;
120         Number rtNum = null;
121  
122         if(number!=null && number.length()>0){
123             if(isCellPhone(number)){
124                 //如果手机号码以0开始,则去掉0
125                 if(number.charAt(0) == '0'){
126                     number = number.substring(1);
127                 }
128  
129                 rtNum = new Number(PhoneType.CELLPHONE, number.substring(07), _number);
130             }else if(isFixedPhone(number)){
131                 //获取区号
132                 String zipCode = getZipFromHomephone(number);
133                 rtNum = new Number(PhoneType.FIXEDPHONE, zipCode, _number);
134             }else{
135                 rtNum = new Number(PhoneType.INVALIDPHONE, null, _number);
136             }
137         }
138  
139         return rtNum;
140     }
141  
142     public static void main(String[] args){
143         Number num = checkNumber("013951699549");
144         System.out.println(num);
145  
146         num = checkNumber("13951699549");
147         System.out.println(num);
148  
149         num = checkNumber("051687189099");
150         System.out.println(num);
151  
152         num = checkNumber("02552160433");
153         System.out.println(num);
154  
155         num = checkNumber("52160433");
156         System.out.println(num);
157     }
158 }

返回结果

上面的代码运行后,返回结果为:
1
2
3
4
5

[number:013951699549, type:CELLPHONE, code:1395169]
[number:13951699549, type:CELLPHONE, code:1395169]
[number:051687189099, type:FIXEDPHONE, code:0516]
[number:02552160433, type:FIXEDPHONE, code:025]
[number:52160433, type:FIXEDPHONE, code:null]

需要注意的是,如果号码不合法,则返回的type类型是INVALIDPHONE(非法号码)。
希望上面的类能给您提供帮助,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值