Java利用正则表达式判断身份证合法性及提取日期

需积分: 16 0 下载量 71 浏览量 更新于2024-07-25 收藏 133KB DOC 举报
“身份证判断与日期提取的Java编程实践” 在Java编程中,处理身份证号码的验证和信息提取是一项常见的任务。这里的描述提出了一个具体的问题,即编写程序来判断输入的字符串是否为合法的15位或18位身份证号码,并从中提取出生日期。这个问题可以通过使用正则表达式来解决。 首先,我们需要理解15位和18位身份证号码的结构。15位身份证号码由6位地区码、6位出生日期码和3位顺序码组成,而18位身份证号码则增加了校验码,其结构为6位地区码、8位出生日期码、3位顺序码和1位校验码。校验码可能是数字或字母(X表示10)。 为了判断身份证号码的合法性,我们可以创建一个正则表达式来匹配这种特定格式。如描述中所示,一个简单的正则表达式是`(\d{17}[0-9a-zA-Z]|\d{14}[0-9a-zA-Z])`,它能匹配15位和18位的身份证号码,其中最后一位可以是数字或字母。 接下来,为了提取出生日期,我们需要更精确的正则表达式。例如,`\\d{6}(\\d{8})`可以匹配前6位地区码后的8位出生日期,而`'(\\d{4})(\\d{2})(\\d{2})'`则用于将8位日期分解为4位年、2位月和2位日。 以下是使用Java的`java.util.regex`包来实现这一功能的代码示例: ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class IDCardCheck { public static void main(String[] args) { String[] ids = {"130681198712092019", "13068119871209201x", "13068119871209201", "123456789012345", "12345678901234x", "1234567890123"}; // 正则表达式1,用于判断身份证号码合法性 Pattern p1 = Pattern.compile("(\\d{17}[0-9a-zA-Z]|\\d{14}[0-9a-zA-Z])"); for (int i = 0; i < ids.length; i++) { Matcher matcher = p1.matcher(ids[i]); System.out.println(ids[i] + ":" + matcher.matches()); } // 正则表达式2,用于提取出生日期 Pattern p2 = Pattern.compile("\\d{6}(\\d{8})"); // 正则表达式3,用于将出生日期分解为年月日 Pattern p3 = Pattern.compile("(\\d{4})(\\d{2})(\\d{2})"); for (int i = 0; i < ids.length; i++) { if (p1.matcher(ids[i]).matches()) { Matcher dateMatcher = p2.matcher(ids[i]); if (dateMatcher.find()) { Matcher yearMonthDayMatcher = p3.matcher(dateMatcher.group(1)); if (yearMonthDayMatcher.find()) { String year = yearMonthDayMatcher.group(1); String month = yearMonthDayMatcher.group(2); String day = yearMonthDayMatcher.group(3); System.out.println("出生日期:" + year + "-" + month + "-" + day); } } } } } } ``` 这段代码首先通过`p1`检查每个字符串是否符合身份证号码的格式,然后使用`p2`和`p3`提取并分解出生日期。需要注意的是,实际应用中可能还需要考虑更多的边界情况和错误处理,例如校验日期的有效性,以及处理非法字符等。 通过使用正则表达式,我们可以在Java程序中有效地实现身份证号码的验证和日期提取。这个过程涉及到对字符串的模式匹配、分组和提取,是数据验证和信息提取的重要方法,也是Java编程中的基础技能之一。