很多学员在测试的时候对于java编写的程序中身份*号码的正则表达式不太清楚,在此专门写一篇博文说明一下。


首先要明白身份*号码的编码规则,然后根据编码规则去写正则表达式:


18位身份*号编码规则如下:

第1位和第2位:省,自治区,直辖市代码(有关取值可查看代码表);

第3位和第4位:地级市,盟,自治州代码(有关取值可查看代码表);

第5位和第6位:县,县级市,区代码(有关取值可查看代码表);

第7位到第10位:出生年;

第11位和第12位:出生月;

第13位和第14位:出生日;

第15位到第17位:顺序码,第17位若是男生则为单数,若是女生则为双数(大家可以自己验证一下)

第18位:表示校验码,可以是0-9或者X(注意是大写的);


所以验证18位身份*号码的正则表达式为:

"^[1-9]\\\\d{5}[1-9]\\\\d{3}((0[1-9])||(1[0-2]))((0[1-9])||(1\\\\d)||(2\\\\d)||(3[0-1]))\\\\d{3}([0-9]||X)$"

其中:

1、^表示开始,$表示结束;

2、前六位:[1-9]第一位是1-9其中一位,后面是0-9随机数5个({5}表示五位数的意思);

3、年份:[1-9]\\\\d{3}表示年份是1-9开始加0-9随机数三个,例如1994;

4、月份:((0[1-9])||(1[0-2]))表示月份是01-09或者10-12其中的两位数;

5、日:((0[1-9])||(1\\\\d)||(2\\\\d)||(3[0-1]))表示01-09或者10-19或者20-29或者30-31其中的两位数;

6、最后四位:\\\\d{3}([0-9]||X)表示3位0-9的随机数加0-9其中一位或者X;


但是以上正则表达式验证的身份*号码只能说是符合×××编码规则,不能确定×××是否有效。因为即使以上的正则表达式仍然无法避免出现2月31日的情况,另外,对于最后一位的校验码是根据具体的公式推算出来的,不是随机的。但是对于当下的一般项目来说,这个正则表达式已经算是比较严谨的一个了。


补充:15位的身份*号已经不再使用,但是对于15位身份*号码的正则表达式也进行一下补充,供大家参考: 

"^[1-9]\\\\d{7}((0[1-9])||(1[0-2]))((0[1-9])||(1\\\\d)||(2\\\\d)||(3[0-1]))\\\\d{3}$"

说明:15位×××出生年显示两位,例如1994年出生,18位×××显示1994,而15位则显示94,另外15位×××无校验码,所以整体比18位身份*号少了3位。


附-×××号最后一位校验码的确定算法为:

1、将身份*号前17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:
7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2;
2、将这17位数字和系数相乘的结果相加,用加出来和除以11,确定余数;
3、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字,其分别对应的最后一位×××的号码为1-0-X-9-8-7-6-5-4-3-2。
大家可以亲自尝试测试一下,看一看用自己身份*号的前17位是否可以推导出最后一位检验码。



讲师更多课程请访问:http://edu.51cto.com/lecturer/5811414.html




转载于:https://blog.51cto.com/zdytesting/1946771