在实际项目中,身份证号码的验证是一个很常见的需求。而用正则表达式进行身份证号码的验证,是一种快捷、方便、且效果好的方法。本文从多个方面来深入解析身份证号正则表达式,并全面掌握身份证号码验证规则,以方便大家在实际开发中快速进行身份证号码的验证。
一、正则表达式的基础知识
正则表达式是用来描述字符串模式的一种工具,可以用来匹配、查找、替换字符串中的模式。在正则表达式中,常用的元字符有: 1. "." - 匹配除换行符以外的任意字符 2. "^" - 匹配行首 3. "$" - 匹配行尾 4. "*" - 匹配前面的字符零次或多次 5. "+" - 匹配前面的字符一次或多次 6. "?" - 匹配前面的字符零次或一次 7. "[]" - 匹配一个字符集,比如[abc]匹配a或b或c 8. "[^]" - 匹配非字符集中的任意字符 9. "{}" - 匹配一个范围数量的字符,比如a{3,5}匹配aaa、aaaa、aaaaa
二、验证身份证号码的基本规则
在验证身份证号码的正则表达式中,需要考虑到身份证号码的基本规则。身份证号码由18个字符组成,由前17位数字和最后一位的校验位组成。其中,前6位数字为行政区划代码,接下来8位数字为出生日期码,后4位为顺序码和最后一位为校验位。出生日期码的格式为YYYYMMDD,例如19990101代表1999年1月1日。 而根据国家标准GB11643-1999《公民身份号码》的规定,身份证号码的校验位的计算方法如下: 1. 将前17位数字乘上对应的系数,系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2 2. 将乘积相加的和对11取余数,得到余数是0~10中的一个数 3. 根据余数找到对应的校验位,规则如下: - 0:1 - 1:0 - 2:X - 3:9 - 4:8 - 5:7 - 6:6 - 7:5 - 8:4 - 9:3 - 10:2 因此,根据身份证号码的基本规则和校验位的计算方法,可以得到如下的身份证号码的正则表达式:
/^([1-9]\d{5})((19\d{2})|(20\d{2}))((0\d)|(1[0-2]))(([0-2]\d)|3[01])\d{3}([0-9]|X)$/
三、身份证号码正则表达式的解析
在上述的身份证号码的正则表达式中,有许多的细节需要注意,下面将一一进行解析,以便更好地掌握身份证号码的验证规则。 首先,正则表达式以"/"开头和结尾,表示这是一个正则表达式。
/^([1-9]\d{5})((19\d{2})|(20\d{2}))((0\d)|(1[0-2]))(([0-2]\d)|3[01])\d{3}([0-9]|X)$/
紧接着,"^"表示字符串的开头,"([1-9]\d{5})"表示匹配前6位行政区划代码,"([1-9]"表示第一位数字不为0,"\d{5})"表示后面5位数字可以为0~9中任意一个数字。 "((19\d{2})|(20\d{2}))"表示匹配年份,"("和")"用来将19\d{2}和20\d{2}分组,"|"表示或的关系。"\d"代表数字,"{2}"表示两位数字。 "((0\d)|(1[0-2]))"表示匹配月份,"0\d"表示1~9月份,"1[0-2]"表示10~12月份。"("和")"用来将0\d和1[0-2]分组,"|"表示或的关系。 "(([0-2]\d)|3[01])"表示匹配日期,"[0-2]\d"表示01~29日,"3[01]"表示30~31日,"("和")"用来将[0-2]\d和3[01]分组,"|"表示或的关系。 "\d{3}"表示结合了年月日的后8位,可以为0~9中任意一个数字,共三位。 "([0-9]|X)$"表示校验位的匹配,最后一位数字可以为0~9中任意一个数字或者大写字母X,"$"表示字符串的结尾。
四、身份证号码的校验方法
在实际应用中,验证身份证号码的方法如下: 1. 根据正则表达式验证身份证号码是否符合规则 2. 如果符合规则,计算校验位并进行比对 3. 如果校验位匹配,则表明身份证号码是正确的 下面是对验证方法的代码实现:
function validateIdNumber(idNumber) {
var regex = /^([1-9]\d{5})((19\d{2})|(20\d{2}))((0\d)|(1[0-2]))(([0-2]\d)|3[01])\d{3}([0-9]|X)$/;
if(!regex.test(idNumber)) {
return false;
}
var factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var sum = 0;
for(var i = 0; i < factors.length; i++) {
sum += parseInt(idNumber[i]) * factors[i];
}
var checkDigit = (12 - sum % 11) % 11;
var checkDigitDict = [1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2];
if(idNumber[17] == checkDigitDict[checkDigit]) {
return true;
}
return false;
}
五、总结
在本文中,我们详细介绍了身份证号码正则表达式的基础知识、验证规则、正则表达式的解析和验证身份证号码的校验方法。正则表达式虽然难以理解,但是掌握了其规则和特点,可以帮助我们快速、准确地完成身份证号码的验证。