您好,登錄后才能下訂單哦!
很多學(xué)員在測試的時候?qū)τ趈ava編寫的程序中身份*號碼的正則表達(dá)式不太清楚,在此專門寫一篇博文說明一下。
首先要明白身份*號碼的編碼規(guī)則,然后根據(jù)編碼規(guī)則去寫正則表達(dá)式:
18位身份*號編碼規(guī)則如下:
第1位和第2位:省,自治區(qū),直轄市代碼(有關(guān)取值可查看代碼表);
第3位和第4位:地級市,盟,自治州代碼(有關(guān)取值可查看代碼表);
第5位和第6位:縣,縣級市,區(qū)代碼(有關(guān)取值可查看代碼表);
第7位到第10位:出生年;
第11位和第12位:出生月;
第13位和第14位:出生日;
第15位到第17位:順序碼,第17位若是男生則為單數(shù),若是女生則為雙數(shù)(大家可以自己驗證一下);
第18位:表示校驗碼,可以是0-9或者X(注意是大寫的);
所以驗證18位身份*號碼的正則表達(dá)式為:
"^[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、^表示開始,$表示結(jié)束;
2、前六位:[1-9]第一位是1-9其中一位,后面是0-9隨機(jī)數(shù)5個({5}表示五位數(shù)的意思);
3、年份:[1-9]\\\\d{3}表示年份是1-9開始加0-9隨機(jī)數(shù)三個,例如1994;
4、月份:((0[1-9])||(1[0-2]))表示月份是01-09或者10-12其中的兩位數(shù);
5、日:((0[1-9])||(1\\\\d)||(2\\\\d)||(3[0-1]))表示01-09或者10-19或者20-29或者30-31其中的兩位數(shù);
6、最后四位:\\\\d{3}([0-9]||X)表示3位0-9的隨機(jī)數(shù)加0-9其中一位或者X;
但是以上正則表達(dá)式驗證的身份*號碼只能說是符合×××編碼規(guī)則,不能確定×××是否有效。因為即使以上的正則表達(dá)式仍然無法避免出現(xiàn)2月31日的情況,另外,對于最后一位的校驗碼是根據(jù)具體的公式推算出來的,不是隨機(jī)的。但是對于當(dāng)下的一般項目來說,這個正則表達(dá)式已經(jīng)算是比較嚴(yán)謹(jǐn)?shù)囊粋€了。
補充:15位的身份*號已經(jīng)不再使用,但是對于15位身份*號碼的正則表達(dá)式也進(jìn)行一下補充,供大家參考:
"^[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位數(shù)分別乘以不同的系數(shù)。從第一位到第十七位的系數(shù)分別為:
7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2;
2、將這17位數(shù)字和系數(shù)相乘的結(jié)果相加,用加出來和除以11,確定余數(shù);
3、余數(shù)只可能有0-1-2-3-4-5-6-7-8-9-10這11個數(shù)字,其分別對應(yīng)的最后一位×××的號碼為1-0-X-9-8-7-6-5-4-3-2。
大家可以親自嘗試測試一下,看一看用自己身份*號的前17位是否可以推導(dǎo)出最后一位檢驗碼。
講師更多課程請訪問:http://edu.51cto.com/lecturer/5811414.html
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。