當前位置:股票大全官網 - 資訊咨詢 - 如何用正則表達式過濾身份證號

如何用正則表達式過濾身份證號

這次給大家帶來的是如何用正則表達式篩選身份證號。使用正則表達式篩選身份證號有哪些註意事項?以下為實戰案例。讓我們來看看。

簡短的話

在對用戶進行實名驗證時,經常會用到身份證號的正則表達式和驗證方案。本文列舉了兩種驗證方案,您可以根據自己的實際項目情況選擇合適的方案。

ID號描述

居民身份證號碼正確、正式的稱謂應為“公民身份號碼”。根據中華人民共和國國家標準GB 11643-1999,公民身份號碼是壹個特征組合碼,由壹個17位數字本體碼和壹個數字校驗碼組成。從左到右的順序是:六位地址碼、八位出生日期碼、三位序列碼、壹位校驗碼。

以北京朝陽區某女性身份證號為例。ID號的含義如下圖所示:

註:身份證號來源於GB 11643-1999。

讓我們從零開始完成壹個完整的身份證號驗證過程。

方案1(簡單)

1.1劃分規則

1.1.1地址碼規則:地址碼長度為6位。

從數字1-9開始。

最後五個數字是從0到9的數字。

根據上述規則,寫出地址碼的正則表達式:/[1-9] \ d {5}/

1.1.2年碼規則:年碼長4位。

以數字18、19或20開頭。

剩下的兩位數是0-9。

根據上述規則,寫出年份編碼的正則表達式:/(18|19|20)\d{2}/。如果不需要18開頭的年份,可以去掉18。

1.1.3月代碼規則:

月份代碼為2位數。

第壹位是0,第二位是1-9。

或者第壹位是1,第二位是0-2。

按照上面的規則,寫出月碼的正則表達式:/((0[1-9])|(1[0-2])/。

1.1.4日期代碼規則:

日期代碼為2位數。

第壹位是0-2,第二位是1-9。

或者10,20,30,31。

根據上述規則,寫出日期代碼的正則表達式:/(([0-2][1-9])| 10 | 20 | 30 | 31)/。

1.1.5序列碼規則:

序列碼有3位數長。

序列碼是壹個數字

根據上述規則,寫出序列碼的正則表達式:/\d{3}/。

1.1.6校驗碼規則:

校驗碼長度為1位。

可以是數字,字母X,也可以是字母X。

根據上述規則,寫出校驗碼的正則表達式:/[0-9Xx]/。

1.2方案1正則表達式

基於以上六條規則,完整的正則表達式和測試程序給出如下:

var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9xx]$/;

//輸出true

console . log(p . test(" 11010519491231002 x "));

//輸出false不能以0開頭。

console . log(p . test(" 01010519491231002 x "));

//輸出假年份不能以17開頭。

console . log(p . test(" 11010517491231002 x "));

//輸出假月不能是13。

console . log(p . test(" 11010519491331002 x "));

//輸出假日期不能是32。

console . log(p . test(" 11010519491232002 x "));

//輸出false不能以結尾。

console . log(p . test(" 11010519491232002 a "));1.3方案分析

方案1只是做了壹個基本的格式判斷,主要有三個缺點:

地址碼確定不夠準確。例:國內沒有以16,26開頭的地區,但通過核查日期可以判斷不夠準確。例:19490231也可以驗證,但是二月沒有31奇偶碼,是用17位本體碼計算的,方案1不驗證這個碼方案2(綜合)。

針對方案1的不足,引入方案2來改進方案1的不足。

2.1省地址碼校驗

華北地區:北京11,天津12,河北13,山西14,內蒙古15。

東北:遼寧21,吉林22,黑龍江23

華東:上海31,江蘇32,浙江33,安徽34,福建35,江西36,山東37。

華中:河南41,湖北42,湖南43

華南:廣東44,廣西45,海南46

西南:四川51,貴州52,雲南53,西藏54,重慶50。

西北:陜西61,甘肅62,青海63,寧夏64,新疆65。

特殊:臺灣省71,香港81,澳門82

根據上面的地址碼,對身份證號的前兩位進行校驗,進壹步提高準確性。現地址碼以2013版行政區劃代碼GB/T2260為準。由於區劃代碼的歷史演變,無法檢查地址碼的後四位數字。以三胖的身份證號為例。我的號碼是2321開頭的,但是現在的行政區劃代碼表中沒有這個代碼。因此,本文只檢查前兩個省地址碼。

也有說91是外國人獲得的中國身份證號碼的前兩位數字開始的,但我沒有得到證實。如果妳有91開頭的身份證或者認識馬布裏,請幫忙確認相關信息。

根據以上分析,省地址碼的驗證和測試程序如下:

var checkProv = function (val) {

var模式= /^[1-9][0-9]/;

Var provs = {11:"北京",12:"天津",13:"河北",14:"山西",15:"內蒙古",265433。33:“浙江”,34:“安徽”,35:“福建”,36:“江西”,37:“山東”,41:“河南”,42:“湖北”,43:“湖南”,44:“廣東”,44。61:“陜西”,62:“甘肅”,63:“青海”,64:“寧夏”,65:“新疆”,71:“臺灣省”,81:“香港”,82:“澳門”。

if(pattern.test(val)) {

if(provs[val]) {

返回true

}

}

返回false

}

//輸出真,37是山東。

console . log(check prov(37));

//輸出false,16不存在。

console . log(check prov(16));2.2出生日期代碼驗證

不解釋出生日期代碼的驗證,直接給出以下功能和測試步驟:

var checkDate = function (val) {

var模式= /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;

if(pattern.test(val)) {

var year = val.substring(0,4);

var month = val.substring(4,6);

var date = val.substring(6,8);

var date2 =新日期(年+"-"+月+"-"+日期);

如果(日期& amp& ampdate 2 . getmonth()= =(parse int(month)-1)){

返回true

}

}

返回false

}

//輸出true

console . log(checkDate(" 20180212 "));

//Output false二月沒有31天。

console . log(checkDate(" 20180231 "));2.3校驗碼檢查

校驗碼的計算略復雜,先給出以下公式:

其中ai表示身份證體碼的第I個值,Wi表示第I個加權因子值。

加權系數表1:

I 12345678 wi 791058421910113141414151565438。

x 012345678910a 1810x 98765432算法流程:

根據身份證科目編碼(前17位)和對應的加權因子(表1)計算乘積再求和,將所得結果與11取模得到X值。

根據x值查表2,得到a18,即校驗碼值。

檢查代碼計算程序並測試見下面的代碼:

var checkCode = function (val) {

var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9xx]$/;

var因子= [ 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];

var parity = [ 1,0,' X ',9,8,7,6,5,4,3,2];

var code = val . substring(17);

if(p.test(val)) {

var sum = 0;

for(var I = 0;我& lt17;i++) {

sum+= val[I]* factor[I];

}

if(parity[sum % 11]= = code . toupper case()){

返回true

}

}

返回false

}

//輸出true,校驗碼匹配。

console . log(checkCode(" 11010519491231002 x "));

//輸出false,校驗碼不匹配。

console . log(checkCode(" 110105194912310021 "));2.4方案二總體代碼

var checkID = function (val) {

if(checkCode(val)) {

var date = val.substring(6,14);

if(檢查日期(日期)){

if(checkProv(val.substring(0,2))) {

返回true

}

}

}

返回false

}

//輸出true

console . log(checkID(" 11010519491231002 x "));

//輸出false,校驗碼不匹配。

console . log(checkID(" 110105194912310021 "));

//輸出false,日期代碼不匹配。

console . log(checkID(" 110105194902310026 "));

//輸出false,區號不匹配。

console . log(checkID(" 160105194912310029 "));相信看完這個案例,妳已經掌握了方法。更多精彩請關註Gxl上其他相關文章!

推薦閱讀:

Vue.js定制事件進入表單的方式。

Vue.js如何讓圖片隨意拖動?

如何使用vue2.0axios跨域和渲染?