【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]
    }
}

猜你喜欢

转载自blog.csdn.net/qq877728715/article/details/115213351