[转载]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位。
具体代码
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( 0 , 7 ), _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号码工具类:实现手机固话号码判断与区号截取相关推荐
- Java时间工具类(获取上个月、获取月份1月1号时间戳、获取月份最后一天时间戳...)
在开发中我们经常还会用到日期时间,以下是一个日期时间工具类,包含: 获取每月月初时间戳 获取每月15号时间戳 获取每月月末时间戳 获取当前被格式化后的日期 从这些方法中你可以改写出你需要的方法 PS: ...
- 手机固话号码判断与区号截取
主要用到的正则表达式: //用于匹配手机号码 private final static String REGEX_MOBILEPHONE = "^0?1[3458]\\d{9}$" ...
- 正则表达式手机固话php,手机和固话正则的记忆方法
手机正则记忆: /^1[34578]\d{9}$/ 原理: ^和$标记是为了强调11位数字的独立性,比如13265977311是一个手机号,但是013265977311,132659773110, ...
- UrlUtils工具类,Java URL工具类,Java URL链接工具类
UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...
- 组织机构代码和统一社会信用代码校验规则以及java校验工具类
组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...
- Hutool Java常用工具类汇总
简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". Hu ...
- 关于手机和固话号码正则表达式
今天开始小编为大家系统整理关于正则表达式的一系列文章,希望大家会喜欢. 首先了解一下正则表达式的概念,正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是 ...
- JAVA常用工具类(实用高效)
JAVA常用工具类(根据GITHUB代码统计) 从Google你能搜索到大量的关于Struts,Spring,Hibernate,iBatis等比较大的框架的资料,但是很少有人去关注一些小的工具包,但 ...
- Java并发工具类(闭锁CountDownLatch)
并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...
最新文章
- CMMI过程域-MA度量和分析
- DL之CNN:利用CNN算法实现对句子分类+进行情感分析(预测句子情感)
- VS2008系统开发背景图片的添加及注意事项
- 关于simulink中参数传递到工作空间
- char添加一个字符_LINUX字符设备驱动模型分析(起始篇)
- VS C++ memcpy() memset()不明确报错
- JT/T808校验码计算(按字节异或求和)
- 考上研究生就脱单?快来看看这些女生多的大学!
- 玩转STM32(4)学会目录分类
- ps教程全套|零基础教程-高阶教程快速入门
- 用mysql征途改等级教程_征途各等级升级经验表附带功勋换经验比例
- 推荐几个查找英语单词缩写的网站
- 解决双屏切换为单屏,打开的软件窗口无法显示问题
- 淘宝京东APP节日更新布局 实现方式
- JPA 学习(四) JPA_EntityManager系列
- 铅酸电池三段式充电过程
- NVIDIA Jetson TX2 简单介绍
- 社区少年宫计算机活动总结,少年宫电脑兴趣小组活动总结
- OpenCPN介绍及编译
- 工具收集 - 重命名工具 ReNamer
热门文章
- 网站服务器费用是什么,建网站费用都包含什么
- socket网络编程封装错误处理函数
- VC++得到当前系统时间日期 GetSystemTime()
- Springboot毕设项目老年健康数据管理及分析平台t46d0(java+VUE+Mybatis+Maven+Mysql)
- 短视频App源码:如何搭建短视频社区
- 高质量股票数据_10个网站免费下载高质量的股票视频
- 找出一个二维数组中的鞍点
- Python PyQt5 PySerial 书签备份 2018/12/6
- 什么是SVN(Subversion)?为什么要用SVN?
- 【Linux】Ubuntu各版本号和名称对照