java使用正規表示式判斷手機號,固定電話,身份證,郵箱,url,車牌號,日期,ip地址,mac,人名等

塵光掠影發表於2018-01-05
版權宣告:本文為博主原創文章,如需轉載,請標明出處。 https://blog.csdn.net/alan_liuyue/article/details/78983474

簡介

  1. 在實際專案中可能會遇到需要判斷一些常用的比較有規則性的字串是否正確,比如手機號、身份證、郵箱、車牌號等;
  2. 使用傳統的java邏輯語句去逐一判斷往往得不到想要的效果,不僅程式碼多,而且速度也慢;
  3. 所以,我們一般都會使用正規表示式去對這些字串進行判斷,下面介紹常用的一些正規表示式的字串判斷寫法;

專案實踐

import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;

/**
 * 通過正則表達判斷是否正確的手機號,固定電話,身份證,郵箱,url,車牌號,日期,ip地址,mac,人名等.
 */
public class validateMatch {
    /**
     * 正則:手機號(簡單), 1字頭+10位數字即可.
     */
    private static final String REGEX_MOBILE_SIMPLE = "^[1]\d{10}$";
    private static final Pattern PATTERN_REGEX_MOBILE_SIMPLE = Pattern.compile(REGEX_MOBILE_SIMPLE);

    /**
     * 正則:手機號(精確), 已知3位字首+8位數字
     * <p>
     * 移動:134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188
     * </p>
     * <p>
     * 聯通:130、131、132、145、155、156、175、176、185、186
     * </p>
     * <p>
     * 電信:133、153、173、177、180、181、189
     * </p>
     * <p>
     * 全球星:1349
     * </p>
     * <p>
     * 虛擬運營商:170
     * </p>
     */
    private static final String REGEX_MOBILE_EXACT = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|(147))\d{8}$";
    private static final Pattern PATTERN_REGEX_MOBILE_EXACT = Pattern.compile(REGEX_MOBILE_EXACT);

    /**
     * 正則:固定電話號碼,可帶區號,然後至少6,8位數字
     */
    private static final String REGEX_TEL = "^(\d{3,4}-)?\d{6,8}$";
    private static final Pattern PATTERN_REGEX_TEL = Pattern.compile(REGEX_TEL);

    /**
     * 正則:身份證號碼15位, 數字且關於生日的部分必須正確
     */
    private static final String REGEX_ID_CARD15 = "^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$";
    private static final Pattern PATTERN_REGEX_ID_CARD15 = Pattern.compile(REGEX_ID_CARD15);

    /**
     * 正則:身份證號碼18位, 數字且關於生日的部分必須正確
     */
    private static final String REGEX_ID_CARD18 = "^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9Xx])$";
    private static final Pattern PATTERN_REGEX_ID_CARD18 = Pattern.compile(REGEX_ID_CARD18);

    /**
     * 正則:郵箱, 有效字元(不支援中文), 且中間必須有@,後半部分必須有.
     */
    private static final String REGEX_EMAIL = "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$";
    private static final Pattern PATTERN_REGEX_EMAIL = Pattern.compile(REGEX_EMAIL);

    /**
     * 正則:URL, 必須有"://",前面必須是英文,後面不能有空格
     */
    private static final String REGEX_URL = "[a-zA-z]+://[^\s]*";
    private static final Pattern PATTERN_REGEX_URL = Pattern.compile(REGEX_URL);

    /**
     * 正則:yyyy-MM-dd格式的日期校驗,已考慮平閏年
     */
    private static final String REGEX_DATE = "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$";
    private static final Pattern PATTERN_REGEX_DATE = Pattern.compile(REGEX_DATE);

    /**
     * 正則:IP地址
     */
    private static final String REGEX_IP = "((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)";
    private static final Pattern PATTERN_REGEX_IP = Pattern.compile(REGEX_IP);


    /**
     * 正則:車牌號
     */
    private static final String REGEX_CAR = "^[京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領A-Z]{1}[A-Z]{1}[A-Z0-9]{3,4}[A-Z0-9掛學警港澳]{1}$";
    private static final Pattern PATTERN_REGEX_CAR = Pattern.compile(REGEX_CAR);


    /**
     * 正則:人名
     */
    private static final String REGEX_NAME = "^([\u4e00-u9fa5]{1,20}|[a-zA-Z\.\s]{1,20})$";
    private static final Pattern PATTERN_REGEX_NAME = Pattern.compile(REGEX_NAME);  

    /**
     * 正則:mac地址
     */
    private static final String REGEX_MAC = "([A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2}";
    private static final Pattern PATTERN_REGEX_MAC = Pattern.compile(REGEX_MAC);    


    //封裝方法:
    /**
     * 驗證手機號(簡單)
     */
    public static boolean isMobileSimple( String str) {
        return isMatch(PATTERN_REGEX_MOBILE_SIMPLE, str);
    }

    /**
     * 驗證手機號(精確)
     */
    public static boolean isMobileExact( String str) {
        return isMatch(PATTERN_REGEX_MOBILE_EXACT, str);
    }

    /**
     * 驗證固定電話號碼
     */
    public static boolean isTel( String str) {
        return isMatch(PATTERN_REGEX_TEL, str);
    }

    /**
     * 驗證15或18位身份證號碼
     */
    public static boolean isIdCard( String str) {
        return isMatch(PATTERN_REGEX_ID_CARD15, str) || isMatch(PATTERN_REGEX_ID_CARD18, str);
    }

    /**
     * 驗證郵箱
     */
    public static boolean isEmail( String str) {
        return isMatch(PATTERN_REGEX_EMAIL, str);
    }

    /**
     * 驗證URL
     */
    public static boolean isUrl( String str) {
        return isMatch(PATTERN_REGEX_URL, str);
    }

    /**
     * 驗證yyyy-MM-dd格式的日期校驗,已考慮平閏年
     */
    public static boolean isDate( String str) {
        return isMatch(PATTERN_REGEX_DATE, str);
    }

    /**
     * 驗證IP地址
     */
    public static boolean isIp( String str) {
        return isMatch(PATTERN_REGEX_IP, str);
    }

    /**
     * 驗證車牌號
     */
    public static boolean isCar( String str) {
        return isMatch(PATTERN_REGEX_CAR, str);
    }

    /**
     * 驗證人名
     */
    public static boolean isName( String str) {
        return isMatch(PATTERN_REGEX_NAME, str);
    }

    /**
     * 驗證mac
     */
    public static boolean isMac( String str) {
        return isMatch(PATTERN_REGEX_MAC, str);
    }

    public static boolean isMatch(Pattern pattern, String str) {
        return StringUtils.isNotEmpty(str) && pattern.matcher(str).matches();
    }

    //測試方法
    public static void main(String[]args){
        String car = "137888888888";        
        System.out.println(isMobileSimple(car));
    }
}

總結

  1. 以上例子包括了手機號、固定電話、身份證、郵箱、url、車牌號、日期、ip地址、mac、人名等的正規表示式驗證;
  2. 正規表示式的寫法是有很多種的,找到合適的便可以,更多其他的寫法歡迎交流;
  3. 實踐是檢驗認識真理性的唯一標準,試一試就知道好不好用了~~~


相關文章