实名认证时,常会用到身份证号码和车牌号码的正则表达式匹配验证。简单高效。
经过一次一次的测试,去除多种匹配的表达式,得出相对正确的正则表达式。

1.车牌号正则匹配

车牌号组成规则

1.民用常规车牌号
常规车牌号由三部分组成,仅允许以汉字开头,后面可录入六个字符,由大写英文字母和阿拉伯数字组成。如:浙A 12345
如下图:

随着车辆的增多,五位序号码已经排满,英文字母都分配或者预留给下辖县市了,市区只好再继续数字字头,不过第二位是英文字母,就是浙A-0A001排列到浙A-0Z999。

2.新军车牌

以两位为大写英文字母开头,后面以5位阿拉伯数字组成。如:BA12345。

3.最后一位为汉字的车牌

有最后一位为汉字的车牌,比如外国大使馆的车牌后面的汉字是个领字,咱们中国警察后面是个警字,挂车后面有个挂字

允许以汉字开头,后面可录入六个字符,前五位字符,由大写英文字母和阿拉伯数字组成,而最后一个字符为汉字。
汉字包括“挂”、“学”、“警”、“港”、“澳”,“领”。如:浙A1234警

4.新能源汽车车牌
新能源汽车车牌新增加两个字段D(表示纯电动)和F(表示非纯电动),小型轿车字段在前面,如:浙AD12345,浙AF12345,大型车字段在后面,如浙A12345D,浙A12345F。
新能源车牌比普通车牌号多一位。

综上:常用车牌号的正则表达式为:

regex=([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z][A-Z][DF]?[A-Z0-9]{4}[A-Z0-9挂学警港澳领][DF]?)

由于开头两位英文字母后面四位字符的这种情况匹配错误率较高,所以舍弃了这种车牌的匹配,正则表达式为:

regex=([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][DF]?[A-Z0-9]{4}[A-Z0-9挂学警港澳领][DF]?)

问题:
写在XML文件中的正则,C++程序读取表达式集合[]中的汉字匹配出现问题,不能准确的匹配汉字。

解决:
将集合[]改为捕获型或者非捕获型括号后,汉字使用或(|)隔离,可以正确匹配汉字。
如下:

regex=((京|津|沪|渝|冀|豫|云|辽|黑|湘|皖|鲁|新|苏|浙|赣|鄂|桂|甘|晋|蒙|陕|吉|闽|贵|粤|青|藏|川|宁|琼|使|领)[A-Z][DF]?[A-Z0-9]{4}[A-Z0-9挂学警港澳领][DF]?)

2.身份证号码分步验证

身份证号码说明

公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

  • 1.1.地址码规则:
    地址码长6位
    以数字1-9开头
    后5位为0-9的数字

    所以,地址码的正则表达式为: [1-9]\d{5}

  • 1.2 年份码规则:
    年份码长4位
    以数字18,19或20开头
    剩余两位为0-9的数字

    所以,年份码的正则表达式: (18|19|20)\d{2}。如果不需要18开头的年份,可以去掉18。

  • 1.3 月份码规则:
    月份码长2位
    第一位数字为0,第二位数字为1-9
    或者第一位数字为1,第二位数字为0-2

    所以,月份码的正则表达式: ((0[1-9])|(1[0-2]))

  • 1.4 日期码规则:
    日期码长2位
    第一位数字为0-2,第二位数字为1-9
    或者是10,20,30,31

    所以,日期码的正则表达式 :(([0-2][1-9])|10|20|30|31)

  • 1.5 顺序码规则:
    顺序码长3位
    顺序码是数字

    所以,顺序码的正则表达式 :\d{3}

  • 1.6 校验码规则:
    校验码长1位
    可以是数字,字母x或字母X

    所以,校验码的正则表达式 :[0-9Xx]

综上,身份证号码完整的正则表达式为:

regex=([1-9]\d{5}(?:18|19|20)\d{2}(?:(?:0[1-9])|(?:1[0-2]))(?:(?:[0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])

我们实际项目XML文档中正则默认全匹配,所以不需要非捕获括号。19世纪的人群身份证号码也舍弃。

因此身份证号码的完成正则表达式为:

regex=([1-9]\d{5}(19|20)\d{2}((?:0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])

前面六位地址为还可以再一步精确。
地址前两位分别为:

province={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",
22:"吉林",23:"黑龙江 ",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",
36:"江西",37:"山东",41:"河南",42:"湖北 ",43:"湖南",44:"广东",45:"广西",
46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏 ",61:"陕西",
62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门"};

根据各个省份前两位地址码可以判定第一位范围1-8,第二位只有重庆是0,其余范围是1-7。因此表达式为:

regex=(([1-8][1-7]|50)\d{4}(19|20)\d{2}((?:0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])

想要再一步精确,可以在首尾加上限定,首尾都是非数字非字母。正则表达式如下:

regex=[^\w](([1-8][1-7]|50)\d{4}(19|20)\d{2}((?:0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])[^\w]

上面正则存在两点不足:

1.地址码不够准确
我国不存在16,26开头的地区,但是仍然可以通过上面验证。
2.月份日期判断不够精确
2月份不存在31日,上面表达式仍然可以通过。

解决:
特殊情况不多的情况下,写程序时可以if判断语句排除这几种情况。

哈哈:每天进步一点点、开心一点点、快乐一点点、good come on!

Regex:身份证号码和车牌号码正则表达式相关推荐

  1. Java:15位或18位居民身份证号码通用校验(正则表达式、日期格式、末尾校验码)

    身份证号码校验,正则表达式校验.日期格式校验.18位身份证末尾校验码校验 前六位省市县号码变更频繁,这里就不做校验 import java.text.ParseException; import ja ...

  2. 验证车牌号码是否有效

    第一个字符必须为汉字,省区市简写: 第二个字符为英文字母: 第三个字符为分隔符"-": 四到八位为数字和字母的结合: 验证车牌号码的正则表达式为: //验证普通的车牌号码 : 吉A ...

  3. 正则验证车牌号码(包括新能源车牌)

    前言: 正则校验车牌号码 校验规则: 1.传统车牌 第1位为省份简称(汉字),第二位为发牌机关代号(A-Z的字母)第3到第7位为序号(由字母或数字组成,但不存在字母I和O,防止和数字1.0混淆,另外最 ...

  4. el-input 输入框类型;只能输入数字的输入框;保留两位小数输入框;只能输入正整数和0的输入框;手机号正则校验;车牌号码正则校验

    以下代码可直接复制使用: 以下代码可直接复制使用! <template><div><a href="https://baike.baidu.com/item/% ...

  5. 根据身份证号和社会保险号码查询不出您的医保信息 请核实后重新填写

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 今天打算 ...

  6. Java、生成车牌号码

    假设一个车牌号码由三个大写字母和后面的四个数字组成.编写一个程序,生成一个车牌号码. package pack2;import java.security.SecureRandom;public cl ...

  7. python基础教程:python+OpenCV实现车牌号码识别

    这篇文章主要介绍了python+OpenCV实现车牌号码识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 基于python+OpenCV的车牌号码识别,供大家参考,具 ...

  8. 《熟练掌握OpenCV----实用计算机视觉工程案例》第5章 车牌号码识别

    人工智能系列经典图书翻译 原   名:<Mastering OpenCV with Practical Computer Vision Projects> 作   者:Shervin Em ...

  9. java毕设项目车牌号码识别系统开源了,很好玩,建议尝试

    1.介绍 这是一个基于spring boot + maven + opencv 实现的Demo教程项目贯穿样本处理.模型训练.图像处理.对象检测.对象识别等技术点,以学习交流为目的,代码注释超多,文档 ...

最新文章

  1. R语言交互式可视化包CanvasXpress
  2. php 自动处理小图的代码,PHP 处理图片的类实现代码
  3. drawroundrect java_Canvas中drawRoundRect()方法介绍
  4. Win10下VS2015(WDK10)驱动开发环境配置
  5. 将mbr的分区改为gpt分区
  6. 为什么 Kubernetes 是微服务发展的必然产物?
  7. android 8.1 跳过,直接跳过8.0!Essential Phone正式迎来Android 8.1
  8. C语言变量声明内存分配
  9. arm平台linux移植ethtool工具
  10. 计算机装系统常用单词,电脑bios中英文对照表大全,安装系统再也不怕英文了...
  11. 记一次勒索病毒的遭遇
  12. 四阶魔方初级玩法公式
  13. 解决文件不显示后缀名的问题
  14. fastadmin页面日期时间组件的调用
  15. java--守护线程处理超时任务
  16. JVm - Parallel Scavenge 垃圾回收器
  17. KiCad 泪滴插件 teardrop plugin
  18. 【学习】大数据关键技术
  19. 解决org.apache.ibatis不存在的问题
  20. keil5如何兼容MDK 和 STC51

热门文章

  1. HTML,CSS,JavaScript 分别是什么?
  2. post方式返回文件流实现前端blob下载,responseType: ‘blob‘无效
  3. 使迅雷超速的六个超级技巧
  4. 迅雷服务器未响应,win10系统打开迅雷就卡死无响应的解决方法
  5. pycharm执行rf测试用例和日志监听
  6. 2020下半年教资综合素质——主观题
  7. linux nvidia 361.run,Ubuntu 16.04+Nvidia GTX 1080+CUDA8.0 深度学习环境配置
  8. 阿里工业互联网平台白皮书 – 数据驱动的新价值网络 - 0910.zip阿里工业互联网平台白皮书 – 数据驱动的新价值网络 -
  9. linux centos fedora audio root 普通用户声卡驱动安装 加载 声音
  10. Linux多线程调度策略