很多学员在测试的时候对于java编写的程序中身份*号码的正则表达式不太清楚,在此专门写一篇博文说明一下。
10余年的龙门网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整龙门建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“龙门网站设计”,“龙门网站推广”以来,每个客户项目都认真落实执行。
首先要明白身份*号码的编码规则,然后根据编码规则去写正则表达式:
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