[原创]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 Matcher;
import 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 = Patternpile(REGEX_FIXEDPHONE);
PATTERN_MOBILEPHONE = Patternpile(REGEX_MOBILEPHONE);
PATTERN_ZIPCODE = Patternpile(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.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()) {
up(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("139********");
System.out.println(num);
num = checkNumber("0516********");
System.out.println(num);
num = checkNumber("025********");
System.out.println(num);
num = checkNumber("52160433");
System.out.println(num);
}
}
返回结果
上⾯的代码运⾏后,返回结果为:
[number:013951699549, type:CELLPHONE, code:1395169]
[number:139********, type:CELLPHONE, code:1395169]
[number:0516********, type:FIXEDPHONE, code:0516]
[number:025********, type:FIXEDPHONE, code:025]
[number:52160433, type:FIXEDPHONE, code:null]
需要注意的是,如果号码不合法,则返回的type类型是INVALIDPHONE(⾮法号码)。希望上⾯的类能给您提供帮助,谢谢!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。