正则匹配身份证号码

正则匹配身份证号码  

/^[1-9][0-7]\d{4}((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d{3}(\d|X|x)?$/

 

首先,地址码的前2位是省级的编号,到统计局去查询得知第1位非0,并且目前的范围为1-9,9是国外的身份证号码。第2位的范围为0-7。统计局一般每一年都会公布一次更新的地址码,但对比多年来的地址码可以看出地址码基本上是不变的(要是变了,现有的身份证号码岂不是都没用了^_^)。我们的地址码的正则表达式可以这样写:/^[1-9][0-7]\d{4}/,其实,这么写不够精确,倘若要就目前的地址码写出精确的表达式,应该这么写/^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d{4}/,这样写显然精确多了,但表达式长了很多,当然为求精确表达式长一点是可以接受的,但是假如统计局修改了省级地址码,那么该表达式要根据实际情况稍作改动,所幸省级地址码应该是不会变的,呵呵,所以选择哪一种表达式都是可以的,我这就不写那么长的表达式了,所以选择/^[1-9][0-7]\d{4}/吧。


 

接下来就是日期了喔,呵呵,貌似之前写过的日期匹配可以借鉴来用一下,当时的那个表达式如下:

/^((((19|20)\d{2})-(0?[13-9]|1[012])-(0?[1-9]|[12]\d|30))|(((19|20)\d{2})-(0?[13578]|1[02])-31)|(((19|20)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29))$/

这个表达式可以匹配1900-2099年的日期,还支持闰年。

 


 

我们的表达式不需要匹配那么长的时间,能够匹配二十世纪的就够了,什么,不知道二十世纪?1900-1999总该知道吧^_^为什么匹配了这个范围就够了呢?去查一下居民身份证的历史吧,我敢打保票1900-1999的范围还太大了。至于二十一世纪的新一代,呵呵,就算他是2000年出生的,目前也就9岁(有些算法是8岁,囧),这些人的号码应该还打印在户口簿里,拿出手也不会产生什么作用,再说,二十一世纪的人也不屑于我目前所写的匹配^_^


 

好吧,废话太多了,开始匹配日期吧。稍微修改了以上表达式:

/((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))/

 


 

正则表达式里没有计算验证的能力,所以对于顺序码,我们除了基本的匹配外无力于做什么,所以顺序码的表达式为:/\d{3}/


 

最后一位数字验证码——/(\d|X|x)?$/。之所以那么写是因为,最后一位可能值为数字或X,但有些人可能习惯将X写成小写的x,我们必须视为正确,而最后的?是为了与15位号码兼容,此时只需将15位号码的年份用4位表示即可用我们以下整合的表达式进行匹配了——

/^[1-9][0-7]\d{4}((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d{3}(\d|X|x)?$/

地址码精确一点的表达式:

/^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d{4}((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d{3}(\d|X|x)?$/

posted @ 2016-12-08 19:01  Barbie7  阅读(6061)  评论(0编辑  收藏  举报