日常开发中,我们会遇到各种各样的数据校验规则,最简单的从非空到复杂一些的编码输入规则,今天就分享一个身份证编码的校验,这个其实也是很常见的,写出来一个是加深印象,其次也可以分享给大家使用,后续想找的话也可以很快找到,上代码:
/** * 检查身份证号是否符合规则 * @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])"; 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位不相同,说明输入错误,有需要的兄弟拿去试试吧