工具类说明

该工具类主要是用于判断号码的类型,如果是手机类型,则返回号码前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;
003  
004 public class NumberUtil {
005     //用于匹配手机号码
006     private final static String REGEX_MOBILEPHONE = "^0?1[3458]\\d{9}$";
007  
008     //用于匹配固定电话号码
009     private final static String REGEX_FIXEDPHONE = "^(010|02\\d|0[3-9]\\d{2})?\\d{6,8}$";
010  
011     //用于获取固定电话中的区号
012     private final static String REGEX_ZIPCODE = "^(010|02\\d|0[3-9]\\d{2})\\d{6,8}$";
013  
014     private static Pattern PATTERN_MOBILEPHONE;
015     private static Pattern PATTERN_FIXEDPHONE;
016     private static Pattern PATTERN_ZIPCODE;
017  
018  
019     static {
020         PATTERN_FIXEDPHONE = Pattern.compile(REGEX_FIXEDPHONE);
021         PATTERN_MOBILEPHONE = Pattern.compile(REGEX_MOBILEPHONE);
022         PATTERN_ZIPCODE = Pattern.compile(REGEX_ZIPCODE);
023     }
024  
025     public static enum PhoneType {
026         /**
027          * 手机
028          */
029         CELLPHONE,
030  
031         /**
032          * 固定电话
033          */
034         FIXEDPHONE,
035  
036         /**
037          * 非法格式号码
038          */
039         INVALIDPHONE
040     }
041  
042     public static class Number {
043         private PhoneType type;
044         /**
045          * 如果是手机号码,则该字段存储的是手机号码 前七位;如果是固定电话,则该字段存储的是区号
046          */
047         private String code;
048         private String number;
049  
050         public Number(PhoneType _type, String _code, String _number) {
051             this.type = _type;
052             this.code = _code;
053             this.number = _number;
054         }
055  
056         public PhoneType getType() {
057             return type;
058         }
059  
060         public String getCode() {
061             return code;
062         }
063  
064         public String getNumber() {
065             return number;
066         }
067  
068         public String toString(){
069             return String.format("[number:%s, type:%s, code:%s]", number, type.name(), code);
070         }
071     }
072  
073     /**
074      * 判断是否为手机号码
075      *
076      * @param number
077      *            手机号码
078      * @return
079      */
080     public static boolean isCellPhone(String number) {
081         Matcher match = PATTERN_MOBILEPHONE.matcher(number);
082         return match.matches();
083     }
084  
085     /**
086      * 判断是否为固定电话号码
087      *
088      * @param number
089      *            固定电话号码
090      * @return
091      */
092     public static boolean isFixedPhone(String number) {
093         Matcher match = PATTERN_FIXEDPHONE.matcher(number);
094         return match.matches();
095     }
096  
097  
098     /**
099      * 获取固定号码号码中的区号
100      *
101      * @param strNumber
102      * @return
103      */
104     public static String getZipFromHomephone(String strNumber) {
105         Matcher matcher = PATTERN_ZIPCODE.matcher(strNumber);
106         if (matcher.find()) {
107             return matcher.group(1);
108         }
109  
110         return null;
111     }
112  
113     /**
114      * 检查号码类型,并获取号码前缀,手机获取前7位,固话获取区号
115      * @param number
116      * @return
117      */
118     public static Number checkNumber(String _number){
119         String number = _number;
120         Number rtNum = null;
121  
122         if(number!=null && number.length()>0){
123             if(isCellPhone(number)){
124                 //如果手机号码以0开始,则去掉0
125                 if(number.charAt(0) == '0'){
126                     number = number.substring(1);
127                 }
128  
129                 rtNum = new Number(PhoneType.CELLPHONE, number.substring(07), _number);
130             }else if(isFixedPhone(number)){
131                 //获取区号
132                 String zipCode = getZipFromHomephone(number);
133                 rtNum = new Number(PhoneType.FIXEDPHONE, zipCode, _number);
134             }else{
135                 rtNum = new Number(PhoneType.INVALIDPHONE, null, _number);
136             }
137         }
138  
139         return rtNum;
140     }
141  
142     public static void main(String[] args){
143         Number num = checkNumber("013951699549");
144         System.out.println(num);
145  
146         num = checkNumber("13951699549");
147         System.out.println(num);
148  
149         num = checkNumber("051687189099");
150         System.out.println(num);
151  
152         num = checkNumber("02552160433");
153         System.out.println(num);
154  
155         num = checkNumber("52160433");
156         System.out.println(num);
157     }
158 }

返回结果

上面的代码运行后,返回结果为:
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(非法号码)。
希望上面的类能给您提供帮助,谢谢!

[转载]JAVA号码工具类:实现手机固话号码判断与区号截取相关推荐

  1. Java时间工具类(获取上个月、获取月份1月1号时间戳、获取月份最后一天时间戳...)

    在开发中我们经常还会用到日期时间,以下是一个日期时间工具类,包含: 获取每月月初时间戳 获取每月15号时间戳 获取每月月末时间戳 获取当前被格式化后的日期 从这些方法中你可以改写出你需要的方法 PS: ...

  2. 手机固话号码判断与区号截取

    主要用到的正则表达式: //用于匹配手机号码 private final static String REGEX_MOBILEPHONE = "^0?1[3458]\\d{9}$" ...

  3. 正则表达式手机固话php,手机和固话正则的记忆方法

    手机正则记忆: /^1[34578]\d{9}$/ ‍原理‍: ^和$标记是为了强调11位数字的独立性,比如13265977311是一个手机号,但是013265977311,132659773110, ...

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

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

  5. 组织机构代码和统一社会信用代码校验规则以及java校验工具类

    组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...

  6. Hutool Java常用工具类汇总

    简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". Hu ...

  7. 关于手机和固话号码正则表达式

    今天开始小编为大家系统整理关于正则表达式的一系列文章,希望大家会喜欢. 首先了解一下正则表达式的概念,正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是 ...

  8. JAVA常用工具类(实用高效)

    JAVA常用工具类(根据GITHUB代码统计) 从Google你能搜索到大量的关于Struts,Spring,Hibernate,iBatis等比较大的框架的资料,但是很少有人去关注一些小的工具包,但 ...

  9. Java并发工具类(闭锁CountDownLatch)

    并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...

最新文章

  1. CMMI过程域-MA度量和分析
  2. DL之CNN:利用CNN算法实现对句子分类+进行情感分析(预测句子情感)
  3. VS2008系统开发背景图片的添加及注意事项
  4. 关于simulink中参数传递到工作空间
  5. char添加一个字符_LINUX字符设备驱动模型分析(起始篇)
  6. VS C++ memcpy() memset()不明确报错
  7. JT/T808校验码计算(按字节异或求和)
  8. 考上研究生就脱单?快来看看这些女生多的大学!
  9. 玩转STM32(4)学会目录分类
  10. ps教程全套|零基础教程-高阶教程快速入门
  11. 用mysql征途改等级教程_征途各等级升级经验表附带功勋换经验比例
  12. 推荐几个查找英语单词缩写的网站
  13. 解决双屏切换为单屏,打开的软件窗口无法显示问题
  14. 淘宝京东APP节日更新布局 实现方式
  15. JPA 学习(四) JPA_EntityManager系列
  16. 铅酸电池三段式充电过程
  17. NVIDIA Jetson TX2 简单介绍
  18. 社区少年宫计算机活动总结,少年宫电脑兴趣小组活动总结
  19. OpenCPN介绍及编译
  20. 工具收集 - 重命名工具 ReNamer

热门文章

  1. 网站服务器费用是什么,建网站费用都包含什么
  2. socket网络编程封装错误处理函数
  3. VC++得到当前系统时间日期 GetSystemTime()
  4. Springboot毕设项目老年健康数据管理及分析平台t46d0(java+VUE+Mybatis+Maven+Mysql)
  5. 短视频App源码:如何搭建短视频社区
  6. 高质量股票数据_10个网站免费下载高质量的股票视频
  7. 找出一个二维数组中的鞍点
  8. Python PyQt5 PySerial 书签备份 2018/12/6
  9. 什么是SVN(Subversion)?为什么要用SVN?
  10. 【Linux】Ubuntu各版本号和名称对照