【Java工具类】用于专门匹配手机号与座机号工具类_墩墩分墩的博客-程序员秘密

技术标签: 正则匹配  手机号校验  座机号校验  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]
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq877728715/article/details/115213351

智能推荐

直播协议 HTTP-FLV 详解_weixin_33860147的博客-程序员秘密

传统的直播协议要么使用 Adobe 的基于 TCP 的 RTMP 协议,要么使用 Apple 的基于 HTTP 的 HLS 协议。今天我要向大家介绍另外一种结合了 RTMP 的低延时,以及可以复用现有 HTTP 分发资源的流式协议 HTTP-FLV。FLV首先介绍一下 FLV 文件格式的细节。FLV Adobe 官方标准FLV 文...

密码加密解密(三)——仿射密码设计_仿射变换加解密代码_DiliLearngent的博客-程序员秘密

代换密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。代换密码包括多种类型,如单表代换密码、多表代换密码等。下面介绍一种典型的单表代换密码——仿射密码。''' args = { name:仿射变换加解密 author:Lsy date:2020-11-18 }'''# 加密函数def encrypt(Plaintext, a, b):

设计模式——行为型模式之借助策略模式(Strategy Pattern)减少使用不必要的if-else if -else和switch-case(八)_CrazyMo_的博客-程序员秘密

引言前一篇文章[设计模式——行为型模式之通过中介者模式实现各模块之间的解耦 [(http://blog.csdn.net/crazymo_/article/details/73527482)总结行为型模式中的中介者模式,通过中介者模式我们可以让各模块专注于自己的核心工作,二把交互等次要问题交给中介者,实现一定程度的解耦,今天就接着总结另一种简单而又有效的行为型模式,相信大家对于if-else ...

Xshell实现Windows上传文件到Linux主机_Luban250的博客-程序员秘密

转载:http://www.linuxidc.com/Linux/2015-05/117975.htm1、使用我们常用的Xshell登录工具,新建立一个远程会话,填写ip地址及用户名密码后,选择最下面的ZMODEM,填写下载的路径,加载的路径;2个路径可以一样也可以不一样;2、在Linux主机上,安装上传下载工具包rz及sz如果不知道你要安装包的具体名称

Android资料整理___骆小跑的博客-程序员秘密

点击图片放大功能 https://www.tuicool.com/articles/ARjE7zaAndroid截屏并对图片做高斯模糊处理 http://gqdy365.iteye.com/blog/2193913使用AndroidStudio分析和解决ImageLoader引起内存泄露问题 http://blog.csdn.net/editor1994/article/details/50394...

【图像篇】opencv图像处理(一)---图像基础知识_fengyuxie的博客-程序员秘密

本是青灯不归客,却因浊酒恋红尘前言 伴随着人类社会历程的不断向前推进,先进的科技就一直承载着人类社会的进步,特别是近年来日渐成熟的AI技术,深远地改变了我们熟悉的...

随便推点

1005. 继续(3n+1)猜想 (25)_3n+1猜想的具体表述是非常简单的: 对任何正整数n做如下变换,如果n 是偶数,则让它变成n/2(也_Brant985的博客-程序员秘密

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇到过了,我们称5、8、4、2是被3“...

Nodejs进阶:Express常用中间件body-parser实现解析_weixin_34206899的博客-程序员秘密

本文摘录自《Nodejs学习笔记》,更多章节及更新,请访问 github主页地址。欢迎加群交流,群号 197339705。写在前面body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析。使用非常简单,以下两行代码已经覆盖了大部分的使用场景。app.use(bodyParser.json())...

idea 使用mvn mybatis-generator:generate自动生成代码_mvn mybatis generate_java皮皮虫的博客-程序员秘密

1.导入mavne插件<plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> &lt...

HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别_光着脚丫数星星的博客-程序员秘密

①HashMap的工作原理HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会

【剑指offer】字符串:全排列(要求有序、去重),字符串比较,第一个只出现一次的字符_David 's blog的博客-程序员秘密

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,从安全性来讲三者是

推荐文章

热门文章

相关标签