身份证号码是中国公民身份的唯一标识,其格式和校验规则相对复杂,因此用正则表达式进行校验是一种高效的方法。本文将详细解析身份证号码的正则表达式校验,并给出Java实现的示例代码。
一、身份证号码格式说明
中国身份证号码分为两种:
1. 15位身份证号码:由15位数字组成,常见于1980年代之前的身份证。格式:[0-9]{15}
2. 18位身份证号码:从1985年开始,采用18位的身份证号码。前17位为数字,最后一位为校验位,可以是数字或字母X。格式:[0-9]{17}([0-9]|X)
二、身份证号码校验规则
- 基本格式校验:检查长度是否为15或18位,且包含的字符是否为数字或字母X。
- 出生日期校验:身份证号码中第7到第14位代表出生日期,必须是有效的日期(例如:19700101不得是未来日期)。
- 校验位的计算: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位身份证号中加入了对校验位的计算,以确保身份证的真实性。这种方法不仅简洁有效,而且易于扩展和维护。在实际应用中,可以根据需求进一步增强日期的有效性检查和完整性。
希望这篇文章对您理解和实现身份证号码的校验有所帮助!