今天项目中遇到了身份证号识别的问题,需要识别15或18位的居民身份证,网上查了一下,感觉很有意思,这里跟大家分享下我的理解过程,希望能帮助大家更好的学习正则表达式。
18位身份证号识别
/^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
这是一个比较完善的识别正则,直接看的话一头雾水,我们先来把他分别成5个部分,首先要说明的是:开头的^符号表示待识别对象的开头,也就是一个字符串开始的位置,而$表示字符串结束的位置。
part1(身份证1-6位):
^([1-6][1-9]|50)\d{4}
方括号中的1-6表示1-6中的任意数字,1-9表示1-9之间的任意数字,所以[1-6][1-9]组合起来表示的是符合规则的两个数字,紧接着的|表示或的关系,也就是说可能为50,再接着的\d{4}表示四位数字。因此part1规定了18位居民身份证号的前6位。
part2(身份证7-10位):
(18|19|20)\d{2}
这部分比较容易理解,首先是(18|19|20),表示可能是18、19、20,接着后面的\d{2}表示为两位数字。
part3(身份证11-12位):
((0[1-9])|10|11|12)
与part2类似,内部括号的内容:(0[1-9])表示两位数字,其中第一位为0,第二位为0-9中任意数字。竖杠表示或者的关系,表示也有可能是10、11、12,总之这段正则就是对两位数字进行限制。
part4(身份证13-14位):
(([0-2][1-9])|10|20|30|31)
与part3类似,首先限制了一个两位数([0-2][1-9]),第一个数为0-2,第二个数为1-9,后面的为除了这个规则之外可能的两位数(可能是10、20、30、31)
part5(身份证15-18位):
\d{3}[0-9Xx]$
这部分也很好理解,首先是3位数字,然后对最后一位(18位)进行限定,这一位可能是0-9直接的数字,也可能是X或者是小写x,最后的最后用$表示整个字符串的结尾。
15位身份证号识别
/^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/
15位身份证的正则识别和18位的类似,我们也是拆开一块一块的来看。
part1(身份证1-6位):
^([1-6][1-9]|50)\d{4}
这部分与15位的part1一致,不做赘述。
part2(身份证7-10位):
\d{2}((0[1-9])|10|11|12)
首先\d{2}表示两位数字,然后括号里面也是表示对两位数字的规则校验(这里校验的是月份)。
part3(身份证11-12位):
(([0-2][1-9])|10|20|30|31)
这部分也是表示两位数字,不做赘述。
part4(身份证13-15位):
\d{3}$
三位数字及结束符号。
一个小小的推荐
作为正则表达式的初学者,刚开始一定会觉得拆分正则比较困难,因为有的正则可能写的很长很长,这里给大家推荐一个能够格式化正则的网站,把正则粘上去,网站就会自动的给拆成一块一块的。RegExr
总结
不管是前端工程师还是后端工程师,正则表达式都是需要掌握的一门技术,深有感触的是在刷一些leetcode的时候,正则总是能出其不意的轻巧化解字符串问题,在工作中,正则也大有用处,不得不说,正则真的是太奇妙了!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。