技术标签: 正则匹配 手机号校验 座机号校验 Java工具类
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 用于专门匹配手机号与座机号工具类
*/
public class NumberUtil {
//用于匹配手机号码
private final static String REGEX_MOBILEPHONE = "^0?1[3456789]\\d{9}$";//11-12
//用于匹配固定电话号码
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;
// 手机号码规则:匹配的号码是第一个为1,第二位为3458,长度为11的号码,前面可以有0.该规则基本满足现有手机的号段。
// 固定电话规则:根据现有的区号规则总结归纳出来的,区号规则是010只有一个、02开头的三位数、03到09开头的四位数。同样,区号也是可选的,真实的号码长度在6到8位。
static {
PATTERN_FIXEDPHONE = Pattern.compile(REGEX_FIXEDPHONE);
PATTERN_MOBILEPHONE = Pattern.compile(REGEX_MOBILEPHONE);
PATTERN_ZIPCODE = Pattern.compile(REGEX_ZIPCODE);
}
/**
* 判断是否为手机号码
*
* @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
* @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 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);
}
}
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]
}
}
传统的直播协议要么使用 Adobe 的基于 TCP 的 RTMP 协议,要么使用 Apple 的基于 HTTP 的 HLS 协议。今天我要向大家介绍另外一种结合了 RTMP 的低延时,以及可以复用现有 HTTP 分发资源的流式协议 HTTP-FLV。FLV首先介绍一下 FLV 文件格式的细节。FLV Adobe 官方标准FLV 文...
代换密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。代换密码包括多种类型,如单表代换密码、多表代换密码等。下面介绍一种典型的单表代换密码——仿射密码。''' args = { name:仿射变换加解密 author:Lsy date:2020-11-18 }'''# 加密函数def encrypt(Plaintext, a, b):
引言前一篇文章[设计模式——行为型模式之通过中介者模式实现各模块之间的解耦 [(http://blog.csdn.net/crazymo_/article/details/73527482)总结行为型模式中的中介者模式,通过中介者模式我们可以让各模块专注于自己的核心工作,二把交互等次要问题交给中介者,实现一定程度的解耦,今天就接着总结另一种简单而又有效的行为型模式,相信大家对于if-else ...
转载:http://www.linuxidc.com/Linux/2015-05/117975.htm1、使用我们常用的Xshell登录工具,新建立一个远程会话,填写ip地址及用户名密码后,选择最下面的ZMODEM,填写下载的路径,加载的路径;2个路径可以一样也可以不一样;2、在Linux主机上,安装上传下载工具包rz及sz如果不知道你要安装包的具体名称
点击图片放大功能 https://www.tuicool.com/articles/ARjE7zaAndroid截屏并对图片做高斯模糊处理 http://gqdy365.iteye.com/blog/2193913使用AndroidStudio分析和解决ImageLoader引起内存泄露问题 http://blog.csdn.net/editor1994/article/details/50394...
本是青灯不归客,却因浊酒恋红尘前言 伴随着人类社会历程的不断向前推进,先进的科技就一直承载着人类社会的进步,特别是近年来日渐成熟的AI技术,深远地改变了我们熟悉的...
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇到过了,我们称5、8、4、2是被3“...
本文摘录自《Nodejs学习笔记》,更多章节及更新,请访问 github主页地址。欢迎加群交流,群号 197339705。写在前面body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析。使用非常简单,以下两行代码已经覆盖了大部分的使用场景。app.use(bodyParser.json())...
1.导入mavne插件<plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <...
①HashMap的工作原理HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会
1.输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:这个题麻烦在:有字符重复上,之前写过全排列的递归分析:https://blog.csdn.net/zDavid_2018/...
最近很多新闻爆出公共免费WiFi的危险,那有些人就庆幸了,觉得自己不出门,用自家的WiFi应该木有多大事,如果你这么想就错了。不管你在家用的是路由器还是WiFi共享精灵,无线WiFi的安全是不能忽视的。而如何保护无线WiFi的安全就成为用户首先要面临的问题,无线WiFi的网络加密就是其中很重要的一环。 一般来说,无线WiFi加密主要有三种方式:WEP,WPA以及WPA2,从安全性来讲三者是