1.按位数及特殊字符限制校验
二代身份证位数为18位,其中个别含有特殊字符X(x),所以数字部分为17位;一代身份证位数为15位;因此全部情况分为三种。
String regexsfz = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(X|x)$)";
2.按身份证组成结构校验
根据身份证号的具体组成,分别需要校验前六位,出生日期八位,最后四位。
String regexsfz2 = "(^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0-2][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X]|[x])$)";
下面是具体分析的过程 :前六位中首位不能是数字0,所以首位校验为[1-9],剩余五位为[0-9];出生日期中年份月份与天数按当前日历情况校验;最后四位中第四位可能为X(x),所以校验要加上这一情况。