正则表达式 校验身份证最全解析 (java 实现)
阿泽不想掉光头发 2024-08-31 08:35:02 阅读 57
一. 完整正则表达式
<code>'^[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]$'
二. 按照含义解析
1. ^[1-9]\d{5}
^[1-9]\d{5} 用于匹配以1-9之间的数字开头,后跟五个数字(0-9)的字符串。
例如,以下字符串会被匹配:
100000
123456
987654
以下字符串不会被匹配:
012345 (因为首位是0)
12345 (因为总长度不足六位)
1234567 (因为超过六位数)
每个部分的含义
^ 这是一个锚点,表示字符串的开始。它确保匹配是从字符串的开头开始的。
[1-9] 方括号定义了一个字符类,这意味着在这个位置可以匹配方括号内的任意一个字符。
1-9 表示1到9之间的任何一个数据,也就说[1-9]表示首位数字必须是1到9之间的任意一个数字。
\d 这是一个预定义字符类,用于匹配任何一个数字,即0-9。
{5} 花括号用于指定前面的模式(这里是\d)应该重复的次数。
5 表示前面的数字字符 \d 也就0-9 任意一个数 应该出现5次
综合起来,整个正则表达式 ^[1-9]\d{5} 的意思是:
^:从字符串的开头开始匹配。
[1-9]:匹配一个1到9之间的数字作为第一个字符。
\d{5}:然后匹配接下来的五个数字(0-9)。
因此,整个表达式用于匹配一个以1到9之间的数字开头,并且后面跟着五个数字的字符串。这种格式通常用于验证中国的六位数邮政编码。
2. (18|19|([23]\d))\d{2}
(18|19|([23]\d)) 括号 () 用于创建一个分组。这意味着所有括号内的内容作为一个整体来处理。
18|19|([23]\d) 是一个选择结构,表示可以匹配 18、19 或者 ([23]\d)。
18 匹配数字 18
19 匹配数字 19
[23] 定义字符类 字符只能是 2 或 3 开头
\d 范围 0-9
([23]\d) 20 21 22 23 24 25 26 27 28 29 30 ...39
\d{2} 指定前面的模式 重复两次 模式 \d 0-9 2 重复几次 00 - 99
综上所述
1800 - 1899
1900 - 1999
2000 - 2999
3000 - 3999
1888 - 3999 年
3. ((0[1-9])|(10|11|12))
((0[1-9])|(10|11|12)) ()分组 表示内部表达式统一处理
(0[1-9])|(10|11|12) | 选择结构
(0[1-9])
0 匹配数字0
[1-9] 1-9 定义字符类 匹配 1 - 9
01 02 ...09
(10|11|12)
10 匹配数字 10
11 匹配数字 11
12 匹配数字 12
综上所述
月份 01 - 09 或 10 - 12
4. (([0-2][1-9])|10|20|30|31)
解析方式同上 自己试试吧 全当练习了
5.\d{3}
解析方式同上 自己试试吧 全当练习了
6.[0-9Xx]$
[0-9Xx]$ 表示最后一位匹配 0 - 9 X x 任意一个值
[] 定义一个字符类
0-9 0到9任意一个值
X 匹配大写X
x 匹配小写x
$ 表示匹配最后一个位
三.简单java校验
package com.sdmuhua.his.hospital.application.biz.impl.upOrDownTemplate.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 正则表达式验证工具类
*/
public class IdCardUtil {
private static final String PATTERN
= "^[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]$";
/**
* 使用字符串方式验证
* @param idCard
* @return
*/
public static boolean isValidString(String idCard) {
if (idCard == null) {
return false;
}
return idCard.matches(PATTERN);
}
/**
* 使用正则表达式处理类验证
* @param idCard
* @return
*/
static boolean isValidPattern(String idCard) {
if (idCard == null) {
return false;
}
// 编译正则表达式
Pattern pattern = Pattern.compile(PATTERN);
// 创建匹配器
Matcher matcher = pattern.matcher(idCard);
// 匹配
return matcher.matches();
}
}
四.参考
【正则表达式】身份证正则表达式详解(史上最全、最详细)-CSDN博客
五.资料
以511502199103223189示例
51 前两位代表省份
15 两位代表市
02 两位代表县
前6位代表省市县
19910322 表示出生日期
31 表示户籍公安局代码
8 性别 偶数女 基数男
9 校验码
身份证最后一位是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。
省 | 市 | 县 | 出生日期 | 出生户籍公安局代码 | 性别 | 校验码 |
---|---|---|---|---|---|---|
51 | 15 | 02 | 19910322 | 31 | 8 | 9 |
校验码计算公式 参考百度百科
上一篇: 四,分析Spring Boot底层机制(Tomcat 启动分析+Spring容器初始化+Tomcat如何关联 Spring 容器) 以及个人编写启动 Tomcat
下一篇: 200道C/C++面试题
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。