正则表达式到底咋玩的!!!
一、举个例子:
如何判断一个字符串是否是合法的身份证尼???
分析:
1.1 身份证有哪几种情况?
情况一:xxxxxx yyyy MM dd 375 0 十八位
情况二:xxxxxx yy MM dd 75 0 十五位
1.2 在写正则之前我们要了解他的组成到底什么?
情况一,身份证 15 位编码规则:
1)xxxxxx :6 位地区编码
2)yymmdd: 出生年 (两位年) 月日,如:910215
3)xx: 顺序编码,系统产生,无法确定
4)p: 性别,奇数为男,偶数为女
 
情况二,身份证 18 位编码规则:
1)xxxxxx :6 位地区编码
2)yyyymmdd: 出生年 (四位年) 月日,如:19910215
3)xxx:顺序编码,系统产生,无法确定,奇数为男,偶数为女
4)y: 校验码,该位数值可通过前 17 位计算获得
补充说明:
1)前 17 位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
2)验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
3)如果验证码恰好是 10,为了保证身份证是十八位,那么第十八位将用 X 来代替
4)校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
5)i 为身份证号码 1...17 位; Y_P 为校验码 Y 所在校验码数组位置

===================================================================

https://jingyan.baidu.com/article/7f41ececff944a593d095c8c.html参照文档

😂 通过网上一顿乱搜这才发现身份证原来是这样来的,以上是简单汇总的简单说明,主要是利于我们去编写正则表达式。那么接下来就是我们要储备哪些技能才能搞定这个这么负责的玩意尼!!!

二、知识准备

  1. 正则表达式元字符和语法
  2. 正则表达式特殊序列 =================================================================== http://www.runoob.com/python/python-reg-expressions.html参照文档 ===================================================================

三、开始编写正则表达式

情况一,身份证 15 位编码规则:

1)xxxxxx :6 位地区编码==>[1-9]\d{5} ,怎么理解这一串尼?答:[1-9] 首位匹配 1 到 9 数字(因为首位不可能有 0 的情况所以用了集合 [1-9]);\d 很明显就是匹配 0 到 9 数字,但是加了个{5}表示匹配\d 范围内的 5 位数字组合,这样就组合成了 6 位地区码的正则了。(看一下知识储备内容对应一下,就是这么理解了!!!)
2)yymmdd: 出生年 (两位年) 月日==>年:\d{2};月:0[1-9]|1[0-2];日:0[1-9]|[1-2]\d|3[0-1]
3)xx: 顺序编码,系统产生,无法确定==>\d{2}
4)p: 性别,奇数为男,偶数为女==>\d{1}
先分组写到一块去:([1-9]\d{5}\d{2})(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])(\d{2}\d{1})

是不是还可以简化?当然可以
1 和 2 的年合并:[1-9]\d{7}
3 和 4 的合并:\d{3}
得到最终版:([1-9]\d{7})(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])(\d{3})

我们在完善一下,身份证肯定要以数字开头数字结尾,那么:
(([1-9]\d{7})(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])(\d{3}$))

情况二,身份证 18 位编码规则:

1)xxxxxx :6 位地区编码==>[1-9]\d{5}
2)yyyymmdd: 出生年 (四位年) 月日==>年:\d{4};月:0[1-9]|1[0-2];日:0[1-9]|[1-2]\d|3[0-1]
3)xxx:顺序编码,系统产生,无法确定,奇数为男,偶数为女==>\d{3}
4)y: 校验码,该位数值可通过前 17 位计算获得==>\d{1}|[Xx]
合并推到出 (不细分析了):(([1-9]\d{9})(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])(\d{3}(\d{1}|[Xx])$))

最后我们把两种情况合并到一起就是一个完整的身份证正则匹配了:

((([1-9]\d{7})(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])(\d{3}$))|(([1-9]\d{9})(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])(\d{3}(\d{1}|[Xx])$)))

平时看着一串都不知道啥意思,研究一趟原来如此很简单!!如有误,请纠正。其实正则一篇简单的文案是讲不完的,但是到这已经满足我们基本使用。

总结:回过头来看一下,其实正则表达式的编写就是正则规则的拼接使用,所以重点是弄明白知识储备中介绍的含义,再去学习怎么写,那样就简单了


↙↙↙阅读原文可查看相关链接,并与作者交流