身份证号码严格检验

    public boolean checkIdCard(String idCard) {
        if (idCard == null || idCard.isEmpty()) { // 当为空时直接返回false
            return false;
        }
        String regex = "^(11|12|13|14|15|21|22|23|31|32|33|34|35|36|37|41|42|43|44|45|46|50|51|52|53|54|61|62|63|64|65)(\\d{4})(19|20|21)(\\d{2})(1[0-2]|0[1-9])(0[1-9]|[1-2][0-9]|3[0-1])(\\d{3})(\\d{1}|X|x)$";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(idCard);
        if (m.matches()){
            /* 粗略校验通过后,必定有18位字符,对身份证的最后一位校验码进行验证 */
            int[] prefix = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; // 加权因子数组
            String[] suffix = new String[] { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }; // 校验码数组,其中X为10
            int wiSum = 0; // 用来保存前17位各自乖以加权因子后的总和
            for (int i = 0; i < 17; i++) {
                wiSum += Integer.valueOf(idCard.charAt(i) + "") * prefix[i];
            }
            int wiMod = wiSum % 11; // 计算出校验码所在数组的位置
            String code = suffix[wiMod]; // 从数组中得到校验码,如果wiMod等于2,则说明校验码是10,身份证号码最后一位应该是X
            String idCardLast = idCard.substring(17); // 获取身份证号码的最后一位,最后一位是校验码
            // 用计算出来的校验码与最后一位身份证号码比较,如果相等,说明验证通过,否则是无效的身份证号码
            return code.equalsIgnoreCase(idCardLast);
        }else {
            return false;
        }
    }

Q.E.D.