工具类说明
该工具类主要是用于判断号码的类型,如果是手机类型,则返回号码前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(非法号码)。
希望上面的类能给您提供帮助,谢谢!