身份证号码的正则表达式及验证详解(Java版实现,Regex)

时间:2025-02-15 16:58:59
import ; import ; import ; import ; import ; public class IdCardValidate { public static void main(String[] args) { (vlidateIdcard("110825199004014010")); // 构造一个符合验证的假身份证号 (genernateCert("110825199004014012")); } // 省份数据 private static Map<Integer, String> provs = new HashMap<>(); static { (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, "*"); (71, "*"); (81, "香港"); (82, "澳门"); } // 验证身份号前18,符合一个简单的身份证号,年是18-20开头的年份 private static boolean checkCode(String cert) { String regex = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$"; if ((regex, cert)) { // 校验合算法 int[] factor = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; String[] parity = new String[] { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }; String code = (17); int sum = 0; for (int i = 0; i < 17; i++) { sum += (((i))) * factor[i]; } if (parity[sum % 11].equals(())) { return true; } } return false; } // 构造符合身份证号规律的身份证号 private static String genernateCert(String cert) { String regex = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$"; if ((regex, cert)) { int[] factor = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; String[] parity = new String[] { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }; String code = (17); int sum = 0; for (int i = 0; i < 17; i++) { sum += (((i))) * factor[i]; } return (0,17)+parity[sum % 11]; } return cert; } // 组合起来,分段验证,提高效率(符合正则使用习惯,分段验证,提高性能) public static boolean vlidateIdcard(String cert) { if (checkCode(cert)) { String date = (6, 14); if (checkDate(date)) { if (checkProv((0, 2))) { return true; } } } return false; } // 验证年 private static boolean checkDate(String date) { String pattern = "^(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$"; if ((pattern, date)) { String month = (4, 6); try { Date date2 = DateUtils.convertString2Date("yyyyMMdd", date); // 这里检验月的原因的,润年校验 if (date2 != null && () == ((month) - 1)) { return true; } } catch (Exception e) { // TODO: handle exception } } return false; } // 检查省份 private static boolean checkProv(String prov) { String pattern = "^[1-9][0-9]"; if ((pattern, prov)) { return ((prov)); } return false; } }