//注:代码非原创,只为记录
java代码:
1 public static Boolean checkPersonCode(String personCode) { 2 3 if (PubUtil.isEmpty(personCode)) 4 return false; 5 6 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]$)|" + 7 "(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)"; 8 9 boolean matches = personCode.matches(regularExpression); 10 11 if(matches) { 12 if(personCode.length()==18) { 13 //前十七位加权因子 14 int[] prefix = new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; 15 //这是除以11后,可能产生的11位余数对应的验证码 16 char[] suffix = new char[]{ '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; 17 int idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和 18 for(int i=0;i<17;i++){ 19 idCardWiSum+=(personCode.charAt(i) - '0') *prefix[i]; 20 } 21 22 int idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置 23 char idCardLast=personCode.charAt(17);//得到最后一位身份证号码 24 25 return idCardLast == suffix[idCardMod]; 26 } 27 } 28 return matches; 29 }
js代码:
1 function checkPersonCode(personCode){ 2 if(PUBUtil.isEmpty(personCode)) 3 return false; 4 5 var 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]$)|(^[1-9]d{5}d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}$)/; 6 7 var isSuccess = regularExpression.test(personCode); 8 if(isSuccess&&personCode.length==18){ 9 //前十七位加权因子 10 var prefix = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]; 11 //这是除以11后,可能产生的11位余数对应的验证码 12 var suffix = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; 13 var idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和 14 for(var i=0;i<17;i++){ 15 idCardWiSum+=personCode[i]*prefix[i]; 16 } 17 var idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置 18 return personCode[17] == suffix[idCardMod]; 19 } 20 return isSuccess; 21 }