JavaScript+Regex 身份证号码的正则表达式及验证详解

网络编程 2025-04-24 23:57www.168986.cn编程入门

在进行用户实名验证时,身份证号码的验证是十分重要的一个环节。本文将为大家列举两种身份证号码的验证方案,以供参考,并结合具体实例进行。

一、关于身份证号码

居民身份证号码,正式称谓为“公民身份号码”。根据中华人民共和国国家标准GB 11643-1999,公民身份号码是由特征组合码组成,包括十七位数字本体码和一位数字校验码。这些号码从左至右依次为六位数字地址码、八位数字出生日期码、三位数字顺序码和一位数字校验码。

以北京市朝阳区一女性身份证号码为例,每个部分所代表的含义如下(注:该身份证号码来源于国标GB 11643-1999):

二、方案一:简单验证

1. 分部规则:

地址码规则:地址码长6位,以数字1-9开头,后5位为0-9的数字。据此规则,地址码的正则表达式为:^[1-9]\d{5}。

年份码规则:年份码长4位,以数字18、19或20开头,剩余两位为0-9的数字。正则表示为:(18|19|20)\d{2}。

月份码规则:月份码长2位,第一位数字为0,第二位数字为1-9;或者第一位数字为1,第二位数字为0-2。正则表示为:((0[1-9])|(1[0-2]))。

日期码规则:日期码长2位,第一位数字为0-2,第二位数字为1-9;或者是10、20、30、31。正则表示为:((([0-2][1-9])|10|20|30|31)。

顺序码规则:顺序码长3位,是数字。正则表示为:\d{3}。

校验码规则:校验码长1位,可以是数字,或者是字母X或x。正则表示为:[0-9Xx]。

综合以上规则,给出的完整的正则表达式及测试程序如下:

方案一分析:方案一主要进行了基本的格式判定,存在以下不足:地址码判定不够精确;日期判定不够精确;未进行校验码的验证。

三、方案二:全面验证

针对方案一的不足,我们引入方案二进行改进。方案二将进行更精确的验证,包括地址码、日期和校验码的全面验证。具体实现方式将在后续文章中详细阐述。

本文介绍了两种身份证号码的验证方案,方案一主要进行基本格式判定,存在精确性不足的问题;方案二将进行更全面的验证,以弥补方案一的不足。在实际项目中,大家可以根据自己的需求选择合适的验证方案。中国身份证地址码及校验详解

一、地址码校验

中国的身份证地址码反映了持证人的所在省份、城市乃至区县。以下是各大区域的地址码:

华北:北京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

根据这些地址码进行身份证的前两位校验。以三胖的身份证号为例,其号码以“23”开头,对应黑龙江。当前行政区划代码以2013版的【GB/T2260】为标准。由于历史原因及行政区划的变动,后四位的校验变得复杂。本文主要关注前两位省级地址码的校验。

在此提供一个简单的校验函数:

JS函数:

```javascript

var checkProv = function (val) {

var pattern = /^[1-9][0-9]/; //身份证前两位的模式

var provs = { /各省份的对应代码/

// ...(此处省略,与上方内容一致)

};

if(pattern.test(val)) { //初步判断是否符合格式

if(provs[val]) { //检查是否在已知的省份代码中

return true; //是则通过校验

}

}

return false; //不在范围内或格式错误

}

```

例如:`console.log(checkProv(37));` 输出应为 `true`,因为37是山东的编码。而`console.log(checkProv(16));` 输出应为 `false`,因为16并非有效的省份编码。

二、出生日期码校验

身份证中的出生日期码反映了持证人的出生年月日。其格式为 `yyyyMMdd`。对于这部分的校验相对简单直接,主要检查日期是否合法。例如,“2月31日”是不合法的日期。具体校验函数略。

三、校验码校验

身份证的最后一位是校验码,用于验证身份证的真实性。其计算涉及身份证前17位与一系列加权因子。由于计算过程复杂,此处不提供详细公式。在实际应用中,通常会使用专门的算法或工具进行校验。如果您需要更深入的或相关代码,请进一步查询相关资料或联系专业人士。【表1:加权因子表】

| i | Wi |

| :--: | :--: |

| 1 | 7 |

| 2 | 9 |

| 3 | 10 |

| 4 | 5 |

| 5 | 8 |

| 6 | 4 |

| 7 | 2 |

| 8 | 1 |

| ...(后续数字与权重对应) | ...(后续数字与权重对应) |

【算法过程】描述:

根据身份证主体码(前17位)与表1中的加权因子进行乘法运算,并将所有乘积相加。得到的总和与数字11取模,结果即为X值。接着,通过查询表2得出相应的校验码值a18。这是一个关键的校验过程,用以确保身份证号的唯一性和准确性。具体步骤如下:

一、加权计算:将身份证主体码中的每一位数字与表1中对应的加权因子相乘。例如,如果主体码的第i位数字是Wi,那么就用Wi乘以对应的加权因子。然后将所有的乘积相加得到一个总和。

校验码计算程序及测试

当我们谈论身份证号码验证时,不得不提的就是校验码的计算与检测。下面是一段关于校验码计算的代码示例,让我们一起看看它是如何工作的。

当我们定义一个名为 `checkCode` 的函数,它接收一个字符串 `val` 作为参数。这个函数主要用于验证身份证号码的合法性。它首先使用正则表达式 `p` 来检查输入字符串是否符合身份证号码的格式要求。接着,根据身份证号码的规则计算校验码,并与输入字符串的最后一位进行比较。如果两者匹配,函数返回 `true`,否则返回 `false`。我们可以使用这个函数来测试一个身份证号码是否合法。例如:

```javascript

console.log(checkCode("11010519491231002X")); // 输出 true,校验码相符

console.log(checkCode("110105194912310021")); // 输出 false,校验码不符

```

接下来是第二个方案的整体代码示例,名为 `checkID` 的函数。这个函数首先调用 `checkCode` 函数来检查输入的身份证号码是否合法。如果合法,它会进一步验证身份证号码中的日期和地区码是否正确。所有这些验证都通过后,函数返回 `true`,否则返回 `false`。让我们来进行一些测试:

```javascript

console.log(checkID("11010519491231002X")); // 输出 true

console.log(checkID("110105194912310021")); // 输出 false,校验码不符

console.log(checkID("110105194902310026")); // 输出 false,日期码不符

console.log(checkID("160105194912310029")); // 输出 false,地区码不符

```

以上就是三胖对身份证号码验证的理解和分析。通过这段代码,我们可以更加深入地了解身份证号码的构成和校验码的算法。实际应用中可能还需要考虑更多的细节和复杂性。如果有任何不足或错误,欢迎大家指正和补充。让我们一起学习和进步!

请注意,这段代码仅用于学习和演示目的。在实际应用中,请确保遵守相关法律法规,尊重和保护个人隐私。不要将这段代码用于任何非法或不当用途。

上一篇:解析.Net 4.0 中委托delegate的使用详解 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by