工具类说明

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

[原创]JAVA号码工具类:实现手机固话号码判断与区号截取的更多相关文章

  1. Java Properties工具类详解

    1.Java Properties工具类位于java.util.Properties,该工具类的使用极其简单方便.首先该类是继承自 Hashtable<Object,Object> 这就奠 ...

  2. Java json工具类,jackson工具类,ObjectMapper工具类

    Java json工具类,jackson工具类,ObjectMapper工具类 >>>>>>>>>>>>>>> ...

  3. Java日期工具类,Java时间工具类,Java时间格式化

    Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...

  4. Java并发工具类 - CountDownLatch

    Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...

  5. MinerUtil.java 爬虫工具类

    MinerUtil.java 爬虫工具类 package com.iteye.injavawetrust.miner; import java.io.File; import java.io.File ...

  6. MinerDB.java 数据库工具类

    MinerDB.java 数据库工具类 package com.iteye.injavawetrust.miner; import java.sql.Connection; import java.s ...

  7. 小记Java时间工具类

    小记Java时间工具类 废话不多说,这里主要记录以下几个工具 两个时间只差(Data) 获取时间的格式 格式化时间 返回String 两个时间只差(String) 获取两个时间之间的日期.月份.年份 ...

  8. Java Cookie工具类,Java CookieUtils 工具类,Java如何增加Cookie

    Java Cookie工具类,Java CookieUtils 工具类,Java如何增加Cookie >>>>>>>>>>>>& ...

  9. UrlUtils工具类,Java URL工具类,Java URL链接工具类

    UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...

随机推荐

  1. luogu P1938找工就业

    一头牛在一个城市最多只能赚D元,然后它必须到另一个城市工作.当然它可以在别处工作一阵子后,又回到原来的城市再最多赚D美元.而且这样的往返次数没有限制城市间有P条单向路径,共有C座城市,编号1~C,奶牛 ...

  2. 简单工厂模式(Factory)

    设计模式序言:这是开始学习设计模式的第一步,也是相对简单的一个设计模式,简单工厂设计模式. 简单工厂就是将业务进行封装,减少代码之间的耦合度,使代码更易于扩展和维护. 以下是简单工厂设计模式的图解: ...

  3. [Contest20180122]超级绵羊异或

    题意:求$a\ xor\left(a+b\right)xor\cdots xor\left(a+b\left(n-1\right)\right)$ 对每一位求答案,第$k$的答案是$\sum\limi ...

  4. mysql获取分类数量

    1.sql <select id="getTypeNum" resultType="TypeNum" > select count(*) as al ...

  5. Orcale自增/Hibernate 配置

    -- 自增  create sequence SEQ_T_APP_USER start with 1 increment by 1; -- 触发器 create trigger DECTUSER_T_ ...

  6. 协同过滤中的Grey Sheep问题

    寒神解释:某些用户的倾向性和品味没有一致性,比较散.因此在协同过滤这种算法里,没办法和某个group有很高的相似/一致度,推荐会失效. 我理解是寻找邻居时候计算得到的相似度和其他用户相似度都非常小,或 ...

  7. codeforces round #264(div2)

    A题   我仅仅想说题意非常坑,一不小心就会wa,哎,不机智的我居然在最后判题的过程中错了,少加一个推断语句. 错的值了,你说呢? #include<map> #include<cm ...

  8. MariaDB数据库管理系统

    MYSQL数据库管理系统被Oracle公司收购后从开源换向到了封闭,导致许多Linux发行版选择了MariaDB.   MYSQL是一款大家都非常熟知的数据库管理系统,技术成熟.配置简单.开源免费并且 ...

  9. Spark(七) -- Scala快速入门

    Scala作为Spark的开发语言,想要成为Spark高手,精通Scala是必须要走的一条路 然后一门语言并不是你想精通就能够精通的,更何况是Scala这种面向对象又面向函数的编程语言,个人觉得其学习 ...

  10. web开发者的博客

    一.  Jerry Qu https://imququ.com/post/sth-about-switch-to-https-2.html 点评:博客做的比较好,样式不错. http知识比较深.