工具類說明
該工具類主要是用於判斷號碼的類型,如果是手機類型,則返回號碼前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(非法號碼)。
希望上面的類能給您提供幫助,謝謝!