public static void main(String[] args) {
boolean isOk=checkCertificatenumByrules("12345678901111111");
}
public static boolean checkCertificatenumByrules(String certificatenum)
throws Exception { if(certificatenum!=null){ certificatenum=certificatenum.trim(); if(certificatenum.length()!=15&&certificatenum.length()!=18){ System.out.println("身份证位数错误!"); return false; } }else{ System.out.println("身份证为空!"); return false; } Integer Y, S;//Y = S % 11; String JYM="10X98765432", M;// js M = JYM.substr(Y, 1); Map<String,Object> areaMap = new HashMap<String,Object>(); areaMap.put("11", "北京");areaMap.put("12", "天津");areaMap.put("13", "河北"); areaMap.put("14", "山西");areaMap.put("15", "内蒙古");areaMap.put("21", "辽宁");areaMap.put("22", "吉林"); areaMap.put("23", "黑龙江");areaMap.put("31", "上海");areaMap.put("32", "江苏");areaMap.put("33", "浙江"); areaMap.put("34", "安徽");areaMap.put("35", "福建");areaMap.put("36", "江西");areaMap.put("37", "山东"); areaMap.put("41", "河南");areaMap.put("42", "湖北");areaMap.put("43", "湖南");areaMap.put("44", "广东"); areaMap.put("45", "广西");areaMap.put("46", "海南");areaMap.put("50", "重庆");areaMap.put("51", "四川"); areaMap.put("52", "贵州");areaMap.put("53", "云南");areaMap.put("54", "西藏");areaMap.put("61", "陕西"); areaMap.put("62", "甘肃");areaMap.put("63", "青海");areaMap.put("64", "宁夏");areaMap.put("65", "新疆"); areaMap.put("71", "台湾");areaMap.put("81", "香港");areaMap.put("82", "澳门");areaMap.put("91", "国外"); String idcard_array []= certificatenum.split(""); // 地区检验 if(!areaMap.containsKey(certificatenum.substring(0, 2))){ System.out.println("身份证号码校验错误!"); return false; } // 身份号码位数及格式检验 String ereg;//正則表达式 switch (certificatenum.length()) { case 15 : if ((Integer.parseInt(certificatenum.substring(6, 8)) + 1900) % 4 == 0 || ((Integer.parseInt(certificatenum.substring(6, 8)) + 1900) % 100 == 0 && (Integer.parseInt(certificatenum.substring(6, 8)) + 1900)% 4 == 0)) { ereg = "^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$";// 测试出生日期的合法性 } else { ereg = "^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$";// 测试出生日期的合法性 } if (Pattern.matches(ereg, certificatenum)){ return true; }else{ System.out.println("身份证号码出生日期超出范围或含有非法字符!"); return false; } case 18 : // 18位身份号码检测 // 出生日期的合法性检查 // 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9])) // 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8])) if (Integer.parseInt(certificatenum.substring(6, 10)) % 4 == 0 || (Integer.parseInt(certificatenum.substring(6, 10)) % 100 == 0 && Integer.parseInt(certificatenum.substring(6, 10))% 4 == 0)) { ereg = "^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$";// 闰年出生日期的合法性正则表达式 } else { ereg = "^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$";// 平年出生日期的合法性正则表达式 } if (Pattern.matches(ereg, certificatenum)) {// 测试出生日期的合法性 // 计算校验位 S = (Integer.parseInt(idcard_array[1]) + Integer.parseInt(idcard_array[11])) * 7 + (Integer.parseInt(idcard_array[2]) + Integer.parseInt(idcard_array[12])) * 9 + (Integer.parseInt(idcard_array[3]) + Integer.parseInt(idcard_array[13])) * 10 + (Integer.parseInt(idcard_array[4]) + Integer.parseInt(idcard_array[14])) * 5 + (Integer.parseInt(idcard_array[5]) + Integer.parseInt(idcard_array[15])) * 8 + (Integer.parseInt(idcard_array[6]) + Integer.parseInt(idcard_array[16])) * 4 + (Integer.parseInt(idcard_array[7]) + Integer.parseInt(idcard_array[17])) * 2 + Integer.parseInt(idcard_array[8]) * 1 + Integer.parseInt(idcard_array[9]) * 6 + Integer.parseInt(idcard_array[10]) * 3; Y = S % 11; M = "F"; JYM = "10X98765432"; M = JYM.substring(Y, Y+1);// 判断校验位 if (M .equals( idcard_array[18])){ return true; // 检测ID的校验位 }else{ System.out.println("身份证号码校验错误!"); return false; } } else{ System.out.println("身份证号码出生日期超出范围或含有非法字符!"); return false; } default : System.out.println("身份证位数错误!"); return false; } }