身份证校验:正则+规则

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;
 }
 }

posted on 2016-07-18 10:31  党建顺  阅读(457)  评论(0编辑  收藏  举报