转载链接:https://blog.csdn.net/zgrkaka/article/details/80341068
^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
先拆分成五段
^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
第一段为地址码,6位数字,不以0开头
第二三四段为生日码,18位身份证的生日码规则为年月日,例:2020年10月15日->20201015
第五段为顺序码+校验码,18位身份证的顺序码为3位数字,校验码1位,校验码为0-9或者大小写的英文X
对各段的详细解析:
- ^[1-9]\d{5}:匹配前6位地址码,不以0开头即以1-9开头,并匹配后续的5位数字
因为不能以0开头,因此不能换成^\d{6},\d会匹配到0-9 - (18|19|([23]\d))\d{2}:匹配年份,匹配1800-3999年:
(18|19|([23]\d)):匹配年份的前两位,18XX年19XX年,2开头的年份或者3开头的年份需要补齐一位,因此需要\d
\d{2}:匹配完年份前两位需要补齐后续两位数字,因此需要\d{2}
对于[23]\d原链接里有人有疑问,在这里补充下:
中括号[ ]表示匹配中括号[ ]内的任意一个字符,只匹配一次
所以[23]只会匹配到一个2或者3,因为需要匹配到20XX-39XX的年份前两位,因此需要加上\d,再多匹配一个数字才能正确匹配
所以[23]\d的匹配的规则为 2加一个数字或者3加一个数字
因此(18|19|([23]\d))\d{2}才能正确匹配到18XX-39XX年
- ((0[1-9])|(10|11|12)):匹配月份
(0[1-9]):匹配01-09的月份
|(10|11|12):或者匹配10-12月份 - (([0-2][1-9])|10|20|30|31):匹配天数
([0-2][1-9]):匹配01-09、 11-19、21-29的天数
|10|20|30|31:或者匹配10,20,30,31的天数 - \d{3}[0-9Xx]$:匹配最后四位,先匹配三位数字的顺序码,并以校验码结束,校验码为单个0-9或者大小写的X