[原創]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位。

具體代碼

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NumberUtil {
    //用於匹配手機號碼
    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}$";

    private static Pattern PATTERN_MOBILEPHONE;
    private static Pattern PATTERN_FIXEDPHONE;
    private static Pattern PATTERN_ZIPCODE;


    static {
        PATTERN_FIXEDPHONE = Pattern.compile(REGEX_FIXEDPHONE);
        PATTERN_MOBILEPHONE = Pattern.compile(REGEX_MOBILEPHONE);
        PATTERN_ZIPCODE = Pattern.compile(REGEX_ZIPCODE);
    }

    public static enum PhoneType {
        /**
         * 手機
         */
        CELLPHONE,

        /**
         * 固定電話
         */
        FIXEDPHONE,

        /**
         * 非法格式號碼
         */
        INVALIDPHONE
    }

    public static class Number {
        private PhoneType type;
        /**
         * 如果是手機號碼,則該字段存儲的是手機號碼 前七位;如果是固定電話,則該字段存儲的是區號
         */
        private String code;
        private String number;

        public Number(PhoneType _type, String _code, String _number) {
            this.type = _type;
            this.code = _code;
            this.number = _number;
        }

        public PhoneType getType() {
            return type;
        }

        public String getCode() {
            return code;
        }

        public String getNumber() {
            return number;
        }

        public String toString(){
            return String.format("[number:%s, type:%s, code:%s]", number, type.name(), code);
        }
    }

    /**
     * 判斷是否為手機號碼
     * 
     * @param number
     *            手機號碼
     * @return
     */
    public static boolean isCellPhone(String number) {
        Matcher match = PATTERN_MOBILEPHONE.matcher(number);
        return match.matches();
    }

    /**
     * 判斷是否為固定電話號碼
     * 
     * @param number
     *            固定電話號碼
     * @return
     */
    public static boolean isFixedPhone(String number) {
        Matcher match = PATTERN_FIXEDPHONE.matcher(number);
        return match.matches();
    }


    /**
     * 獲取固定號碼號碼中的區號
     * 
     * @param strNumber
     * @return
     */
    public static String getZipFromHomephone(String strNumber) {
        Matcher matcher = PATTERN_ZIPCODE.matcher(strNumber);
        if (matcher.find()) {
            return matcher.group(1);
        }

        return null;
    }

    /**
     * 檢查號碼類型,並獲取號碼前綴,手機獲取前7位,固話獲取區號
     * @param number
     * @return
     */
    public static Number checkNumber(String _number){
        String number = _number;
        Number rtNum = null;

        if(number!=null && number.length()>0){
            if(isCellPhone(number)){
                //如果手機號碼以0開始,則去掉0
                if(number.charAt(0) == '0'){
                    number = number.substring(1);
                }

                rtNum = new Number(PhoneType.CELLPHONE, number.substring(0, 7), _number);
            }else if(isFixedPhone(number)){
                //獲取區號
                String zipCode = getZipFromHomephone(number);
                rtNum = new Number(PhoneType.FIXEDPHONE, zipCode, _number);
            }else{
                rtNum = new Number(PhoneType.INVALIDPHONE, null, _number);
            }
        }

        return rtNum;
    }

    public static void main(String[] args){
        Number num = checkNumber("013951699549");
        System.out.println(num);

        num = checkNumber("13951699549");
        System.out.println(num);

        num = checkNumber("051687189099");
        System.out.println(num);

        num = checkNumber("02552160433");
        System.out.println(num);

        num = checkNumber("52160433");
        System.out.println(num);
    }
}
 

 

 

返回結果

上面的代碼運行后,返回結果為:

[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(非法號碼)。
希望上面的類能給您提供幫助,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM