正则表达式验证身份证号以及验证校验位的正确性
需求:给定一个字符串,从中提取出身份证号
关于验证15位和18位身份证号的正则表达式可以参考下面的内容:
http://www.cppcns.com/wangluo/re/183062.html
一、18位身份证号各个数字代表的含义
1-2位:省、自治区、直辖市代码
3-4位:地级市、盟、自治州代码
5-6位:县、县级市、区代码
7-14位:出生年月日
15-17位:顺序号,17位男为单数,女为双数
18位:校验位(0-9,Xx)
二、15位身份证号
1-2位:省、自治区、直辖市代码
3-4位:地级市、盟、自治州代码
5-6位:县、县级市、区代码
7-12位:出生年月日
13-15位:顺序号,15位男为单数,女为双数
三、18位身份证与15位身份证号的区别
15位身份证号没有效验码和出生年份的“19”或“20”
四、校验位的计算
- 1、将前面的身份证号码17位数分别乘以不同的 系数。 从第一位到第十七位的系数分别为:
7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2 - 2、将这17位数字和系数相乘的结果相加。
- 3、用加出来和除以11,看余数是多少?
- 4、余数只可能有0-1-2-3-4-5-6- 7-8-9-10
这11个数字。 其分别对应的最后 一位身份证的号码为
1-0-X-9-8-7-6-5-4-3-2。 - 5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
- 例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
- 首先我们得出前17位的乘积和是189,然后用189除以11得出的结果是17+2/11,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的数字是x。所以,可以判定这是一个合格的身份证号码。
五、身份证前两位地区编码:
11-北京,12-天津,13-河北,14-山西,15-内蒙古,21-辽宁,22-吉林,23-黑龙江,31-上海,32-江苏,33-浙江,34-安徽,35-福建,36-江西,37-山东,41-河南,42-湖北,43-湖南,44-广东,45-广西,46-海南,50-重庆,51-四川, 52-贵州,53-云南,54-西藏,61-陕西,62-甘肃,63-青海,64-宁夏,65-新疆,71-台湾,81-香港,82-澳门,91-国外
六、下面贴上代码,供自己学习使用:
6.1 身份证前两位对应的省份
@SuppressWarnings("unchecked")private static Hashtable getAreaCode() {Hashtable hashtable = new Hashtable();hashtable.put("11", "北京");hashtable.put("12", "天津");hashtable.put("13", "河北");hashtable.put("14", "山西");hashtable.put("15", "内蒙古");hashtable.put("21", "辽宁");hashtable.put("22", "吉林");hashtable.put("23", "黑龙江");hashtable.put("31", "上海");hashtable.put("32", "江苏");hashtable.put("33", "浙江");hashtable.put("34", "安徽");hashtable.put("35", "福建");hashtable.put("36", "江西");hashtable.put("37", "山东");hashtable.put("41", "河南");hashtable.put("42", "湖北");hashtable.put("43", "湖南");hashtable.put("44", "广东");hashtable.put("45", "广西");hashtable.put("46", "海南");hashtable.put("50", "重庆");hashtable.put("51", "四川");hashtable.put("52", "贵州");hashtable.put("53", "云南");hashtable.put("54", "西藏");hashtable.put("61", "陕西");hashtable.put("62", "甘肃");hashtable.put("63", "青海");hashtable.put("64", "宁夏");hashtable.put("65", "新疆");hashtable.put("71", "台湾");hashtable.put("81", "香港");hashtable.put("82", "澳门");hashtable.put("91", "国外");return hashtable;}
6.2判断身份证最后一位的值: 将身份证号码的前17位数分别乘以不同的系数, 将这17位数字和系数相乘的结果相加,用加出来的和除以11,得到余数, 根据余数的值得出最后一位身份证号码。
public static boolean judgeIdcardEnd(String str) {boolean flag = true;String idcard = "";int TotalmulAiWi = 0;String[] ValCodeArr = { "1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2" };String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2" };idcard = str.substring(0, 17);// 得到身份证号前17位for (int i = 0; i < 17; i++) {TotalmulAiWi = TotalmulAiWi + Integer.parseInt(String.valueOf(idcard.charAt(i))) * Integer.parseInt(Wi[i]);}int modValue = TotalmulAiWi % 11; // 取余String strVerifyCode = ValCodeArr[modValue];// 通过余数得到最后一位身份证号if (strVerifyCode.equals("x")) { idcard = idcard + strVerifyCode;if (idcard.equals(str) == false) { //如果为false,说明身份证号最后一位为XstrVerifyCode = "X"; //将最后一位身份证号赋值为XString idcard1 = idcard.substring(0, 17); //重新截取前17位数idcard1 = idcard1 + strVerifyCode;if (idcard1.equals(str) == false) {return false;}}} else {idcard = idcard + strVerifyCode;if (idcard.equals(str) == false) {return false;}}return flag;}
6.3 提取18位身份证号并验证18位身份证号
public static List<String> extractIdcard18(String str) {List<String> idcard18List = new ArrayList<>();Pattern pattern = Pattern.compile("[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]");Matcher matcher = pattern.matcher(str);while (matcher.find()) {String str1 = matcher.group();// 判断身份证前两位地区编码是否存在Hashtable h = getAreaCode();if (h.get(str1.substring(0, 2)) != null && judgeIdcardEnd(str1)) {idcard18List.add(str1);System.out.println("18位身份证号是:" + idcard18List);}}return idcard18List;}
七、 本文总结
首先通过正则表达式提取出18位数字,在正则表达式中对身份证号上的出生年月日已经做出了相应的验证,所以后续需要进行验证的则是前6位和后4位,本文已对前2位数字进行验证,但对于3-6位身份证号并没有做出相应的验证,对15-17位也没有验证,仅通过计算校验位的方式来进行识别,总体上实现了对身份证号的提取。
正则表达式验证身份证号以及验证校验位的正确性相关推荐
- 身份证号的验证与解析
最近参加一些招聘,很多时候时候身份证号都会作为表单的一部分,需要用户进行填写.有些表单在填写了身份证号之后,还需要用户手动填写籍贯.性别.出生年月.以及年龄等信息,其实这些信息都在身份证号里面包含了. ...
- python判断身份证是否合法的函数_Python开发之身份证验证库id_validator验证身份证号合法性及根据身...
上个星期,大佬分享了一个验证身份证号合法性的库:id_validator,没空去试着用一下看看,今天有点时间,来试着用下这个库. 1.首先,要安装这个库,windows+R键运行cmd,打开命令行窗口 ...
- 身份证号合法性验证、电话手机验证、邮箱验证、银行卡验证、车牌验证
js验证: 身份证号合法性验证 电话手机验证 邮箱验证 银行卡验证 车牌验证 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function Iden ...
- js进阶正则表达式15验证身份证号(|符号的使用:var reg=/^\d{17}[\d|X]$|^\d{15}$/)(str的方法substr)...
js进阶正则表达式15验证身份证号(|符号的使用:var reg=/^\d{17}[\d|X]$|^\d{15}$/)(str的方法substr) 一.总结 1.|符号的使用:var reg=/^\d ...
- 身份证校验(//身份证号合法性验证 //支持15位和18位身份证号//支持地址编码、出生日期、校验位验证)
window.checkIdNumber=(function () {var vcity = {11: "北京", 12: "天津", 13: "河北 ...
- js实现完美身份证号有效性验证+身份证与姓名匹配
/* 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位 ...
- js身份证号有效性验证
js身份证号有效性验证 1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用 ...
- 用python判断身份证号性别_验证身份证号的Python脚本
引用 a[0], a[1], a[2], a[3], ..., a[16], a[17] 其中a[i]表示第i位数字,i=0,1,2,...,17,如果最后一位(校验位)是X,则a[17]=10 每一 ...
- javascript实现完美身份证号有效性验证15位18位
欢迎各位朋友! 前几天在开发中要求对用户的身份证号进行比较严格的校验,所以才有了这些代码, 下面的这些代码主要包括对身份证长度,地区,出生日期的校验. 方法在return时返回了一个是否通过以及提 ...
最新文章
- 1.4 微生物对人类社会的影响
- MongoDB 数据库创建、删除、表(集合) 创建删除、数据的增、删、改、查
- UE4之TextureSample
- Silverlight Tools 安装失败 解决办法
- mschart控件_使用MSChart控件绘制图表。
- 地图找房(四)02——小区房源列表展示和隐藏 小区房源列表数据填充 接口数据-图片地址的基准路径
- 黑客之门:深入浅出windows的dll文件[图]
- ubuntu20.04下源码安装hyperscan库安装记录
- 宋红康JVM 学习笔记
- 【MODBUS通讯协议】
- python中对fits文件读取和保存
- 计算机网络发展的第四阶段特点,计算机网络基础考试重点.doc
- 11月29日做题截图
- 【第五课】UAV倾斜摄影测量三维建模之空三计算问题
- html表格方式实现商品详情
- 大华摄像头java开发之抓图
- 跨境电商的痛点有哪些?
- 数据库和表的基本操作
- php sql injection,PHP防止SQL Injection
- 【Proteus仿真】利用74LS148扩展单片机中断