文章目录
(最简单的利用正则表达式)
了解编码规则
- 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
- 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
如何完成身份证的校验
/ ^ [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]$/;
身份证号码的正则表达式
前6位地区编码(dddddd)
数字开头不能为0 取1-9数字。后五位可以为0-9的数字。
正则表达式: /^ [ 1-9 ] \d{5}/
- " ^ "匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。
- " [ " 标记一个中括号表达式的开始
出生年月日(yymmdd)
- 年
多为19**、20** 还可能存在18**
所以这一部分正则表达式为:/(18|19|20)\d{2}/
表示18、19、20后可在输入两位确切的年份例1999可通过校验。 - 月
如果属于0-9月,则第一位为0第二位为1-9;
如果属于10-12月,则第一位数字为1第二位为0-2.
正则表达式: /((0[1-9])|(1[0-2]))/ - 日
最大范围为:1-31。
分为三部分
1-9日,第一位为0第二位为1-9;
10-19,第一位为1第二位为0-9;
20-29,第一位为2第二位为0-9;
30-31,第一位为3第二位为0-1;
简化:第一位数字为0-2,第二位数字为1-9或者是10,20,30,31
正则表达式:/(([0-2][1-9])|10|20|30|31)/
顺序编码(xxp)
顺序码总共为3位,p代表性别,奇数为男、偶数为女。
正则表达式 :/\d{3}/
校验码(y)
校验码,该位数值可通过前17位计算获得
数值为0-9或者x X
正则表达式:/[0-9Xx]/
校验码规则:
-
前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
-
验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
余数 [ 0, 1, 2 ,3 , 4 , 5 , 6 , 7 , 8 ,9 ,10] -
如果验证码恰好是10,为了保证身份证是十八位,那么第十八位将用X来代替
(余数为2,对应10用x下面有详解) -
校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
-
i为身份证号码1…17 位; Y_P为校验码Y所在校验码数组位置
实例:
某男性的身份证号码为【53010219200508011x】, 我们看看这个身份证是不是合法的身份证。
- 首先我们得出前17位的乘积和【(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)】是189。
- 用189除以11得出的结果是189/11=17----2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。
初步判断代码
public void judge(String idNumber) {
//正则表达式
String regIdNumber="^[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]$";
boolean isMatch= Pattern.matches(regIdNumber,idNumber);
if (isMatch){
System.out.println("通过验证");
}else{
System.out.println("身份证号有误");
}
}
增加校验码判断
public void judge(String idNumber) {
//正则表达式初步判断
String regIdNumber="^[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]$";
boolean isMatch= Pattern.matches(regIdNumber,idNumber);
int sum=0;
//如果初步判断成功进入校验码判断
if (isMatch){
if(idNumber.length()==18);
//加权因子
int[] idNo={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
int i=0;
for (i=0;i<17;i++){
sum+=(Integer.parseInt(String.valueOf(idNumber.charAt(i))))*idNo[i];
}
i=sum%11;
if (i==2){
if(idNumber.substring(17).equals("x")||idNumber.substring(17).equals("X"))
System.out.println("身份证合格");
else System.out.println("校验失败");
}else if (Integer.parseInt(String.valueOf(idNumber.charAt(i)))==idNo[i]){
System.out.println("校验失败");
}else {
System.out.println("身份证不正确");
}
}else{
System.out.println("身份证号格式有误");
}
}