### 正则表达式校验身份证号码
#### 知识点概述
身份证号码在中国大陆具有唯一性,用于标识每一个公民的身份。身份证号码分为15位和18位两种格式,其中18位号码是在15位基础上增加了一个4位出生年份以及一位校验码。本文将详细介绍如何使用正则表达式进行身份证号码的有效性和合理性验证。
#### 简单校验:正则表达式的使用
简单校验主要检查身份证号码是否为15位或18位,并且对于18位号码,最后一位可以是数字或大写“X”。这种校验方式较为基础,适用于初步筛选或快速验证场景。以下是对应的正则表达式:
```javascript
/^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/
```
解释:
- `^` 表示字符串的开头。
- `\d{15}` 表示15个数字。
- `\d{18}` 表示18个数字。
- `\d{17}(\d|X|x)` 表示17位数字后面跟着一个数字或“X”或“x”。
- `$` 表示字符串的结尾。
- `|` 作为或运算符,表示前面或后面的条件都满足。
#### 复杂校验:详细验证逻辑
复杂校验不仅检查长度,还对身份证号码的合理性进行判断,包括出生日期的有效性以及校验码的正确性。这种方法更适用于需要高度准确性的场景。
1. **长度验证**:首先确保身份证号码为15位或18位,且15位号码全部由数字组成,而18位号码的前17位为数字,最后一位为数字或“X”。
```javascript
if(!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
alert('身份证号码不合法,格式不符合规定\n15位应全为数字,18位最后一位为数字或X');
return false;
}
```
2. **出生日期有效性验证**:检查身份证号码中的出生日期是否真实存在。具体来说,就是将出生日期部分提取出来,转换为`Date`对象,然后与身份证号码上的日期进行比较。
- 对于15位号码:
```javascript
var arrSplit = num.match(new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/));
var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
var bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) {
alert('身份证出生日期不合法');
return false;
}
```
- 对于18位号码:
```javascript
var arrSplit = num.match(new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/));
var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
var bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) {
alert('身份证出生日期不合法');
return false;
}
```
3. **校验码验证**:对于18位号码,还需要校验最后一位校验码是否正确。校验码的计算依据ISO 7064:1983 MOD 11-2算法,步骤如下:
- 定义一个权重数组`arrInt`,用于与身份证号码前17位进行相乘。
- 定义一个校验码数组`arrCh`,根据加权求和的结果得到校验码。
- 计算加权和,并根据结果获取对应的校验码。
```javascript
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var nTemp = 0;
for (var i = 0; i < 17; i++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
var valnum = arrCh[nTemp % 11];
if (valnum != num.substr(17, 1)) {
alert('18位身份证校验码不正确, 应该为' + valnum);
return false;
}
```
#### 总结
通过以上介绍,我们可以看到使用正则表达式进行身份证号码的简单校验是一种快速有效的方法,而复杂的校验则能够进一步确保身份证号码的合理性和合法性。在实际应用中,可以根据不同的需求选择合适的校验策略。
- 1
- 2
前往页