正则表达式 校验身份证最全解析 (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

校验码计算公式 参考百度百科



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。