工具类说明
该工具类主要是用于判断号码的类型,如果是手机类型,则返回号码前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; |
004 | public class NumberUtil { |
006 | private final static String REGEX_MOBILEPHONE = "^0?1[3458]\\d{9}$" ; |
009 | private final static String REGEX_FIXEDPHONE = "^(010|02\\d|0[3-9]\\d{2})?\\d{6,8}$" ; |
012 | private final static String REGEX_ZIPCODE = "^(010|02\\d|0[3-9]\\d{2})\\d{6,8}$" ; |
014 | private static Pattern PATTERN_MOBILEPHONE; |
015 | private static Pattern PATTERN_FIXEDPHONE; |
016 | private static Pattern PATTERN_ZIPCODE; |
020 | PATTERN_FIXEDPHONE = Pattern.compile(REGEX_FIXEDPHONE); |
021 | PATTERN_MOBILEPHONE = Pattern.compile(REGEX_MOBILEPHONE); |
022 | PATTERN_ZIPCODE = Pattern.compile(REGEX_ZIPCODE); |
025 | public static enum PhoneType { |
042 | public static class Number { |
043 | private PhoneType type; |
045 | * 如果是手机号码,则该字段存储的是手机号码 前七位;如果是固定电话,则该字段存储的是区号 |
048 | private String number; |
050 | public Number(PhoneType _type, String _code, String _number) { |
053 | this .number = _number; |
056 | public PhoneType getType() { |
060 | public String getCode() { |
064 | public String getNumber() { |
068 | public String toString(){ |
069 | return String.format( "[number:%s, type:%s, code:%s]" , number, type.name(), code); |
080 | public static boolean isCellPhone(String number) { |
081 | Matcher match = PATTERN_MOBILEPHONE.matcher(number); |
082 | return match.matches(); |
092 | public static boolean isFixedPhone(String number) { |
093 | Matcher match = PATTERN_FIXEDPHONE.matcher(number); |
094 | return match.matches(); |
104 | public static String getZipFromHomephone(String strNumber) { |
105 | Matcher matcher = PATTERN_ZIPCODE.matcher(strNumber); |
106 | if (matcher.find()) { |
107 | return matcher.group( 1 ); |
114 | * 检查号码类型,并获取号码前缀,手机获取前7位,固话获取区号 |
118 | public static Number checkNumber(String _number){ |
119 | String number = _number; |
122 | if (number!= null && number.length()> 0 ){ |
123 | if (isCellPhone(number)){ |
125 | if (number.charAt( 0 ) == '0' ){ |
126 | number = number.substring( 1 ); |
129 | rtNum = new Number(PhoneType.CELLPHONE, number.substring( 0 , 7 ), _number); |
130 | } else if (isFixedPhone(number)){ |
132 | String zipCode = getZipFromHomephone(number); |
133 | rtNum = new Number(PhoneType.FIXEDPHONE, zipCode, _number); |
135 | rtNum = new Number(PhoneType.INVALIDPHONE, null , _number); |
142 | public static void main(String[] args){ |
143 | Number num = checkNumber( "013951699549" ); |
144 | System.out.println(num); |
146 | num = checkNumber( "13951699549" ); |
147 | System.out.println(num); |
149 | num = checkNumber( "051687189099" ); |
150 | System.out.println(num); |
152 | num = checkNumber( "02552160433" ); |
153 | System.out.println(num); |
155 | num = checkNumber( "52160433" ); |
156 | System.out.println(num); |
返回结果
上面的代码运行后,返回结果为:
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(非法号码)。
希望上面的类能给您提供帮助,谢谢!