中国大陆身份证正则表达式(严格验证省份和日期)
详细讲解
身份证号前两位为省级行政区划
11: “北京”,
12: “天津”
13: “河北”,
14: “山西”,
15: “内蒙古”,
正则表达:1[1-5]
21: “辽宁”,
22: “吉林”,
23: “黑龙江”,
正则表达:2[1-3]
31: “上海”,
32: “江苏”,
33: “浙江”,
34: “安徽”,
35: “福建”,
36: “江西”,
37: “山东”,
正则表达:3[1-7]
41: “河南”,
42: “湖北”,
43: “湖南”,
44: “广东”,
45: “广西”,
46: “海南”,
正则表达:4[1-6]
50: “重庆”,
51: “四川”,
52: “贵州”,
53: “云南”,
54: “西藏”,
正则表达:5[0-4]
61: “陕西”,
62: “甘肃”,
63: “青海”,
64: “宁夏”,
65: “新疆”,
正则表达:6[1-5]
省级部分合并正则表达:[16][1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]
前六位为县级行政区划,为省级代码加4位数字
正则表达:([16][1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4])\d{4}
日期部分4位年
4位年,从1900到2099:(19|20)\d{2}
月和日期
0[469](0[1-9]|[12][0-9]|30)
4、6、9月有30天
11(0[1-9]|[12][0-9]|30)
11月有30天
上面两行合并后表达为:(?:0[469]|11)(?:0[1-9]|[12][0-9]|30)
0[13578](0[1-9]|[12][0-9]|3[01])
1、3、5、7、8月有31天
1[02](0[1-9]|[12][0-9]|3[01])
10月和12月有31天
上面两行合并后表达为:(?:0[13578]|1[02])(?:0[1-9]|[12][0-9]|3[01])
02(0[1-9]|[12][0-9])
2月最多29天,但约有3/4的时候是28天,这里没办法判断不润年的情况
合并月份和日期部分如下:(?:(?:0[469]|11)(?:0[1-9]|[12][0-9]|30)|(?:0[13578]|1[02])(?:0[1-9]|[12][0-9]|3[01])|02(?:0[1-9]|[12][0-9]))
后四位,不对校验位进行检查(太复杂,正则不可能实现)\d{3}[\dXx]
完整的身份证正则表达式
(?:[16][1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4])\d{4}(?:19|20)\d{2}(?:(?:0[469]|11)(?:0[1-9]|[12][0-9]|30)|(?:0[13578]|1[02])(?:0[1-9]|[12][0-9]|3[01])|02(?:0[1-9]|[12][0-9]))\d{3}[\dXx])