java中身份*號正則表達式
很多學員在測試的時候對於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
本文出自 “昊洋_棲息處” 博客,請務必保留此出處http://zdytesting.blog.51cto.com/5811414/1946771
java中身份*號正則表達式