检查身份证号是否符合规则

288 阅读2分钟

日常开发中,我们会遇到各种各样的数据校验规则,最简单的从非空到复杂一些的编码输入规则,今天就分享一个身份证编码的校验,这个其实也是很常见的,写出来一个是加深印象,其次也可以分享给大家使用,后续想找的话也可以很快找到,上代码:

/** * 检查身份证号是否符合规则 * @param idNumber 本次检查行数据 * @return */ public boolean isIdNumber(String idNumber) { if (StringUtils.isBlank(idNumber)) { return false; } // 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母) String regularExpression = "(^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])"+"([19]d5d2((0[19])(101112))(([02][19])10203031)d3)|" + "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3})"; boolean matches = idNumber.matches(regularExpression); // 判断第18位校验值 if (matches) { if (idNumber.length() == ID_NUMBER_LENGTH) { try { char[] charArray = idNumber.toCharArray(); // 前十七位加权因子 int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 这是除以11后,可能产生的11位余数对应的验证码 String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; int sum = 0; for (int i = 0; i < idCardWi.length; i++) { int current = Integer.parseInt(String.valueOf(charArray[i])); int count = current * idCardWi[i]; sum += count; } char idCardLast = charArray[17]; int idCardMod = sum % 11; if (idCardY[idCardMod].toUpperCase() .equals(String.valueOf(idCardLast).toUpperCase())) { return true; } else { log.info("身份证最后一位:" + String.valueOf(idCardLast).toUpperCase() + "错误,正确的应该是:" + idCardY[idCardMod].toUpperCase()); return false; }

            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    }
    return matches;
}

其中的正则表达式没啥说的,有基础的可以看懂,没基础的复制完了自己试试好使就行,主要是对18位身份证号最后一位的校验,可能需要看看代码逻辑理解一下,前17位数分别乘以对应的加权因子,然后除以11的余数是验证码数组的索引,如果对应的验证码跟第18位不相同,说明输入错误,有需要的兄弟拿去试试吧