正则表达式 校验身份证最全解析 (java 实现)

时间:2025-02-15 16:57:42

 一. 完整正则表达式

^[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-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[0-9Xx]$

十五位: ^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$


‌正则表达式可以部分验证身份证号码的格式,但不能完全验证身份证号码的合法性。
建议在使用时结合编程语言中的日期函数来进一步验证日期的有效性,特别是对于那些特定月份的天数限制和闰年的处理。此外,校验码的验证也需要通过算法来完成,确保整个身份证号码的有效性。

二. 按照含义解析

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 ;

import ;
import ;

/**
 * 正则表达式验证工具类
 */
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 (PATTERN);
    }
    /**
     * 使用正则表达式处理类验证
     * @param idCard
     * @return
     */
    static boolean isValidPattern(String idCard) {
        if (idCard == null) {
            return false;
        }
        // 编译正则表达式
        Pattern pattern = (PATTERN);
        // 创建匹配器
        Matcher matcher = (idCard);
        // 匹配
        return ();
    }
}

四.参考

【正则表达式】身份证正则表达式详解(史上最全、最详细)-****博客

五.资料

以511502199103223189示例

51 前两位代表省份

15 两位代表市

02 两位代表县

前6位代表省市县

19910322 表示出生日期

31 表示户籍*局代码

8 性别 偶数女 基数男

9 校验码

身份证最后一位是根据前面十七位数字码,按照ISO 7064: 11-2校验码计算出来的检验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。

身份证格式
出生日期 出生户籍*局代码 性别 校验码
51 15 02 19910322 31 8 9

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