身份证号码是中国公民身份的唯一标识,其格式和校验规则相对复杂,因此用正则表达式进行校验是一种高效的方法。本文将详细解析身份证号码的正则表达式校验,并给出Java实现的示例代码。

一、身份证号码格式说明

中国身份证号码分为两种: 1. 15位身份证号码:由15位数字组成,常见于1980年代之前的身份证。格式:[0-9]{15} 2. 18位身份证号码:从1985年开始,采用18位的身份证号码。前17位为数字,最后一位为校验位,可以是数字或字母X。格式:[0-9]{17}([0-9]|X)

二、身份证号码校验规则

  1. 基本格式校验:检查长度是否为15或18位,且包含的字符是否为数字或字母X。
  2. 出生日期校验:身份证号码中第7到第14位代表出生日期,必须是有效的日期(例如:19700101不得是未来日期)。
  3. 校验位的计算:18位身份证的最后一位校验位是根据前17位数字计算得出的。

三、正则表达式编写

以下是一个覆盖15位和18位身份证号的正则表达式:

^(?:\d{15}|\d{17}(\d|X))$

这里用(?: ... )是非捕获组,|表示或者,\d表示数字,X是校验位。

四、Java实现

下面是一个简单的Java实现,包括基本的格式校验,并运用正则表达式来验证身份证号码。

import java.util.regex.Pattern;

public class IDCardValidator {

    // 正则表达式
    private static final String IDCARD_REGEX = "^(?:\\d{15}|\\d{17}(\\d|X))$";

    /**
     * 验证身份证号码
     *
     * @param idCard 身份证号码
     * @return 验证结果
     */
    public static boolean isValidIDCard(String idCard) {
        // 首先使用正则表达式进行初步验证
        if (!Pattern.matches(IDCARD_REGEX, idCard)) {
            return false;
        }

        // 如果是18位身份证,进行校验位验证
        if (idCard.length() == 18) {
            return validateChecksum(idCard);
        }

        // 可以加入15位身份证的进一步校验(如出生日期),这里略去
        return true;
    }

    /**
     * 校验18位身份证的校验位
     *
     * @param idCard 身份证号码
     * @return 验证结果
     */
    private static boolean validateChecksum(String idCard) {
        int[] weightFactors = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        char[] checkDigits = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
        int sum = 0;

        for (int i = 0; i < 17; i++) {
            sum += (idCard.charAt(i) - '0') * weightFactors[i];
        }

        int mod = sum % 11;
        char calculatedCheckDigit = checkDigits[mod];
        return idCard.charAt(17) == calculatedCheckDigit;
    }

    public static void main(String[] args) {
        String idCard1 = "123456789012345"; // 示例15位身份证
        String idCard2 = "11010519491231002X"; // 示例18位身份证

        System.out.println("身份证1验证结果:" + isValidIDCard(idCard1));
        System.out.println("身份证2验证结果:" + isValidIDCard(idCard2));
    }
}

五、总结

通过使用正则表达式,我们可以迅速识别和校验身份证号码的格式。此外,在18位身份证号中加入了对校验位的计算,以确保身份证的真实性。这种方法不仅简洁有效,而且易于扩展和维护。在实际应用中,可以根据需求进一步增强日期的有效性检查和完整性。

希望这篇文章对您理解和实现身份证号码的校验有所帮助!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部