Java 15位身份证正则表达式

引言

身份证是我们在日常生活中经常使用的一种证件,用于证明个人的身份和籍贯。中国的身份证由18位和15位两种,其中15位身份证是2000年以前发放的,现在已经不再使用。然而,有时候我们仍然需要对15位身份证进行验证。本文将介绍如何使用Java正则表达式验证15位身份证号码。

身份证号码的结构

中国的身份证号码是由17位数字和1位校验码组成的。其中,前6位代表省份,接下来8位代表出生日期,再接下来3位代表出生顺序号,最后1位是校验码。15位身份证是在出生日期前面加上了2位年份表示,其中规定20世纪的年份以19开头,21世纪的年份以20开头。

正则表达式

为了验证15位身份证号码,我们可以使用正则表达式。下面是一个可以用于验证15位身份证的Java正则表达式示例:

String regex = "^\\d{6}(\\d{2})(\\d{2})(\\d{2})\\d{2}\\d{2}\\d{2}\\d{1}$";

让我们来解析一下这个正则表达式:

  • ^ 代表匹配字符串的开头
  • \\d{6} 匹配6位数字,代表省份
  • (\\d{2}) 匹配2位数字,代表出生年份
  • (\\d{2}) 匹配2位数字,代表出生月份
  • (\\d{2}) 匹配2位数字,代表出生日期
  • \\d{2}\\d{2}\\d{2} 匹配6位数字,代表出生顺序号
  • \\d{1} 匹配1位数字,代表校验码
  • $ 代表匹配字符串的结尾

这个正则表达式可以用于验证15位身份证号码的基本格式,但并不能验证省份、出生年份、出生月份和出生日期的有效性。

验证身份证的有效性

在实际中,我们通常需要进一步验证身份证的有效性。这包括验证省份、出生年份、出生月份和出生日期的合法性,以及校验码是否正确。

验证省份和校验码

身份证的第1位到第6位代表了所属的省份。每个省份的前两位数字都是固定的,我们可以使用正则表达式验证这一部分。校验码是身份证号码的最后一位,它是由前面17位数字通过特定的算法计算得到的。我们可以使用如下代码验证省份和校验码:

public boolean validateProvinceAndCheckCode(String idCard) {
    String regex = "^\\d{6}(\\d{2})(\\d{2})(\\d{2})\\d{2}\\d{2}\\d{2}\\d{1}$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(idCard);
    
    if (matcher.matches()) {
        String provinceCode = idCard.substring(0, 2);
        String checkCode = idCard.substring(idCard.length() - 1);
        
        // 验证省份
        if (!isValidProvince(provinceCode)) {
            return false;
        }
        
        // 验证校验码
        if (!isValidCheckCode(idCard)) {
            return false;
        }
        
        return true;
    }
    
    return false;
}

private boolean isValidProvince(String provinceCode) {
    // 省份代码列表
    String[] provinceCodes = {"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"};
    
    for (String code : provinceCodes) {
        if (code.equals(provinceCode))