onlyliuxin / coding2017

218 stars 643 forks source link

正则表达式-(外国人永久居留身份证)真实的项目需求 #500

Closed yanghuichi closed 7 years ago

yanghuichi commented 7 years ago

default

需求见下方

yanghuichi commented 7 years ago

说明: 下方写一个公共的JS接口,共其他模块调用,加粗部分写正则表达式


当证件类型为“61-外国人永久居留身份证”时,系统需要对国籍、证件号码、证件有效期、姓名进行如下规则校验: 1、国籍规则校验: 1)当前页面存在国籍字段,则当证件类型为“61-外国人永久居留身份证”时,仅允许录入非中国国籍。若违反,保存时系统拦截报错:外国人永久居留身份证仅供非中国国籍客户使用! 2)校验说明:在初审和预收录入的投保人/被保人信息页面为提示报错;除此之外的为拦截报错 2、证件号码规则校验: 1)位数校验。证件号码位数必须为15位,若违反,则光标移开时系统弹出拦截信息:外国人永久居留身份证长度非法! 2)生日校验。判断当前页面是否存在出生日期字段 存在出生日期,则出生日期字段值必须与证件号码中的出生日期一致(比对关系见说明),若违反,保存时系统拦截报错 不存在出生日期,则不进行此校验 报错信息:出生日期与外国人永久居留身份证不符! 说明:出生日期校对码为第8位至第13位数(8-9位是出生年份的后两位,10-13位是出生月日 3)国籍校验。判断当前页面是否存在国籍字段 存在国籍字段,则国籍字段录入值必须不能为“中国”,若违反,保存时系统拦截报错 不存在国籍字段,则再判断该客户在核心表中国籍字段是否有值: 若有值,则字段值不能为“中国”,若违反,保存时系统拦截报错 若无值,则不进行此校验 报错信息:国籍与外国人永久居留身份证不符!外国人永久居留身份证仅供非中国国籍客户使用! 4)合法性校验。校验出生年月是否合法,若违反,则光标移开时系统弹出拦截信息:外国人永久居留身份证的证件号错误! 说明:出生年月校对码为第8位至第13位数(8-9位是出生年份的后两位,10-13位是出生月日):出生月日需符合日期编码,若不符合则非法 5)校验说明:对于第3)点校验在初审和预收录入的投保人/被保人/受益人/账号录入信息页面为提示报错;除此之外的为拦截报错

3、证件有效期规则校验: 1)证件有效期必录,若违反,保存时系统报错:请录入证件有效期 2)若投保时客户年龄小于18周岁,且使用外国人永久居留身份证,则证件有效期不能大于当前投保日期+5年。若违反,保存时系统报错:外国人永久居留身份证的证件有效期错误! 3)若投保时客户年龄大于或等于18周岁的,且使用外国人永久居留身份证投保,则证件有效期不能大于当前投保日期+10年。若违反,保存时系统报错:外国人永久居留身份证的证件有效期错误! 4)校验说明:对于1)、2)、3)点,在初审和预收录入的投保人/被保人/受益人/账号录入信息页面为提示报错;除此之外的为拦截报错。

4、 姓名规则校验(在现有规则基础上增加校验): 1)姓名必须为英文字段,若违反,保存时系统报错:当前证件类型仅允许录入英文姓名 2)姓名中间仅允许存在空格或逗号(半角),若违反,保存时系统报错:请录入正确的英文姓名 3)客户姓名必需为大写字母的英文字母。若前端录入为小写,系统自动转换为大写 4)客户姓名为英文姓名时,客户姓名前后无空格,姓名中间使用逗号(半角)。若前端录入时在姓名前后带空格,系统自动去除前后空格;在姓名中间的空格,系统自动转换为逗号(半角)。 校验说明:对于1)、2)点,在初审和预收录入的投保人/被保人/受益人/账号录入信息页面为提示报错;除此之外的为拦截报错

yanghuichi commented 7 years ago

image

证件照片补充说明,如上图

如:CAN110081080319,前三位是国籍代码:CAN指的是 加拿大

出生日期校对码为第8位至第13位数(8-9位是出生年份的后两位,10-13位是出生月日

关于证件号码,需要写出2种备选方案: 1、只校验15位的长度即可 (正则表达式是:^.{15}$)

2、共15位,前三位大写字母,后12位都是数字 (正则表达式是:^[A-Z]{3}\d{12}$)

eulerlcs commented 7 years ago

首先你提出的身份证号码的需求很复杂,用一个正则表达式完成几乎不可能。 所以,我们分成几个表达式,一步一步地来验证。

  1. 位数校验。证件号码位数必须为15位,且前三位必须是大写字母,后12位必须是数字。 对应正则表达式 ^[A-Z]{3}\d{12}$

  2. 出生日期校对码为第8位至第13位数(8-9位是出生年份的后两位,10-13位是出生月日) 如果知道确切的出生年月日(YYMMDD)的话,比如811201 那么对应的正则表达式 ^.{7}811201.{2}$ 如果不知道的话,只能校验8-9位是连个数字,10-11位保证在01到12中,12-13位保证在01到31中。 对应正则表达式 ^.{7}\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01]).{2}$

  3. 保证YYMMDD是一个合法日期,几乎可能。

  4. 正则表达式不能做运算,不能大小比较。所以你提的和投保日的关联性check做不到。

yanghuichi commented 7 years ago

@eulerlcs

4、 姓名规则校验(在现有规则基础上增加校验): 1)姓名必须为英文字段,若违反,保存时系统报错:当前证件类型仅允许录入英文姓名 2)姓名中间仅允许存在空格或逗号(半角),若违反,保存时系统报错:请录入正确的英文姓名 3)客户姓名必需为大写字母的英文字母。若前端录入为小写,系统自动转换为大写 4)客户姓名为英文姓名时,客户姓名前后无空格,姓名中间使用逗号(半角)。若前端录入时在姓名前后带空格,系统自动去除前后空格;在姓名中间的空格,系统自动转换为逗号(半角)。


关于姓名这块的校验能写正则表达式不,逐条写一个?

eulerlcs commented 7 years ago

其余的我就不帮你写了,太多了,我回答不过来。 你自己结合我讲课的ppt,还有那本书,再上网搜搜。 学以致用,好吗,请谅解。