1. 程式人生 > >身份證號java正則表示式驗證

身份證號java正則表示式驗證

public class Verification {
    private final static Map<String, String> cityMap;
    static {
        cityMap = new HashMap<>();
        cityMap.put("11", "北京");
        cityMap.put("12", "天津");
        cityMap.put("13", "河北");
        cityMap.put("14", "山西");
        cityMap.put("15", "內蒙古");

        cityMap.put("21", "遼寧");
        cityMap.put("22", "吉林");
        cityMap.put("23", "黑龍江");

        cityMap.put("31", "上海");
        cityMap.put("32", "江蘇");
        cityMap.put("33", "浙江");
        cityMap.put("34", "安徽");
        cityMap.put("35", "福建");
        cityMap.put("36", "江西");
        cityMap.put("37", "山東");

        cityMap.put("41", "河南");
        cityMap.put("42", "湖北");
        cityMap.put("43", "湖南");
        cityMap.put("44", "廣東");
        cityMap.put("45", "廣西");
        cityMap.put("46", "海南");

        cityMap.put("50", "重慶");
        cityMap.put("51", "四川");
        cityMap.put("52", "貴州");
        cityMap.put("53", "雲南");
        cityMap.put("54", "西藏");

        cityMap.put("61", "陝西");
        cityMap.put("62", "甘肅");
        cityMap.put("63", "青海");
        cityMap.put("64", "寧夏");
        cityMap.put("65", "新疆");

        cityMap.put("71", "臺灣");
        cityMap.put("81", "香港");
        cityMap.put("82", "澳門");
        cityMap.put("91", "國外");
    }

    //粗略的校驗
    private static final Pattern pattern = Pattern.compile("^(\\d{6})(19|20)(\\d{2})(1[0-2]|0[1-9])(0[1-9]|[1-2][0-9]|3[0-1])(\\d{3})(\\d|X|x)?$");

    /**
     * 18位身份證校驗,粗略的校驗
     * @author lyl
     * @param idCard
     * @return
     */
    public static boolean is18ByteIdCard(CharSequence idCard){
        return pattern.matcher(idCard).matches();
    }
    /**
     * 18位身份證校驗,比較嚴格校驗
     * @author lyl
     * @param idCard
     * @return
     */
    public static boolean is18ByteIdCardComplex(CharSequence idCard){
        int[] prefix = new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        char[] suffix = new char[]{ '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
        if(is18ByteIdCard(idCard)){
            if(cityMap.get(idCard.subSequence(0,2).toString()) == null ){
                return false;
            }
            int idCardWiSum=0;  //用來儲存前17位各自乖以加權因子後的總和
            for(int i=0;i<17;i++){
                idCardWiSum+=(idCard.charAt(i) - '0') *prefix[i];
            }

            int idCardMod=idCardWiSum%11;//計算出校驗碼所在陣列的位置
            char idCardLast=idCard.charAt(17);//得到最後一位身份證號碼

            return idCardLast == suffix[idCardMod];
        }
        return false;
    }