很多学员在测试的时候对于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位数分别乘以不同的系数。从第一位到第十七位的系数分别为:讲师更多课程请访问:http://edu.51cto.com/lecturer/5811414.html
本文出自 “昊洋_栖息处” 博客,请务必保留此出处http://zdytesting.blog.51cto.com/5811414/1946771
原文地址:http://zdytesting.blog.51cto.com/5811414/1946771