乐趣区

关于正则表达式:正则表达式应用之身份证号识别

明天我的项目中遇到了身份证号辨认的问题,须要辨认 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 的时候,正则总是能出人意料的字符串问题笨重化解,在工作中,正则也大有用途,不得不说,正则真的是太微妙了!

退出移动版