在使用c++11 regex验证车牌号前,要首先明白有几个坑要踩:

1.车牌号校验规则,只有弄清楚了校验车牌号的规则才能写出正确的正则表达式,所以首先要弄清楚车牌号的校验规则。

2.c++11 中regex的用法,其中用到了regex、 regex_match,其中有个坑就是中文的匹配。

一、车牌号校验规则

1.普通常见车牌(蓝牌、黄牌)

车牌号码的长度:7位 , 第一位是省份简称, 第二位是发证机关代码,第二位到第七位是大写英文字符和阿拉伯数字组成。例如:京A88888

2.最后一位为汉字的车牌。

车牌号码的长度:7位 , 第一位是省份简称, 第二位是发证机关代码,第二位到第六位是大写英文字符和阿拉伯数字组成。最后一个字符为汉字,汉字包括“挂”、“学”、“警”、“港”、“澳”。比如:鲁A8888学

3.新军车牌

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

4.新能源车牌

车牌号码的长度:8位 , 第一位是省份简称, 第二位是发证机关代码,按照现行新能源车牌号码规则:

第三位:1-9DF;

第四位:1-9A-Z,无I、O字母;

第五-七位:0-9;

第八位:1-9DF;

关于第1、2、3种车牌

省份简称:京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新

发证机关代码:ABCDEFGHJKLMNPQRSTUVWXY (无 I, O , Z 三个字母。其中O和Z属于特殊车牌类型)

车牌号码:

数字:0123456789

字母:ABCDEFGHJKLNMxPQRSTUVWXYZ (说明:无 I, O 字母;)

所以1、2、3种车牌匹配的正则表达式如下:

^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[ABCDEFGHJKLMNPQRSTUVWXY]{1}[ABCDEFGHJKLNMxPQRSTUVWXYZ 0-9]{4}[ABCDEFGHJKLNMxPQRSTUVWXYZ 0-9挂学警港澳]{1}$

关于新能源车牌:

车牌匹配正则表达式如下:

^[京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新][ABCDEFGHJKLMNPQRSTUVWXY][1-9DF][1-9ABCDEFGHJKLMNPQRSTUVWXYZ]\d{3}[1-9DF]$

二、c++11 regex介绍

C++11 为我们提供了正则表达式库regex,头文件#include <regex>

  • std::regex类

    该类型是有一个代表正则表达式的字符串和一个文法选项作为输入,当文法选项不指定时默认为ECMAScript

  • std::regex_match匹配函数

​ std::regex_match是全文匹配,即输入的字符串要和正则表达式全部匹配,才认为匹配成功返回true,否则匹配失败返回false

  • std::regex_search

​ std::regex_search是在输入的字符串中不断搜索符合正则表达式描述的子字符串,然后将第一个匹配到的子字符串返回。

  • std::regex_replace

​ std::regex_replace是在std::regex_search的基础上将匹配的子字符串替换为提供的字符串。

  • 关于中文

    若是正则表达式里有中文字符,就不能使用std::regex类了,要使用std::wregex类,字符串参数也不是string了,要改为wstrig,若提供的参数字符串是string的话,还要把string转换为wstring,不然正则表达式匹配不起作用,不信的人可以自己试一下。

三、示例代码

// CPPstudy.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <regex>
/*** @brief string转换为wstring* @param strInput 要转换的string字符串 * @return
*/
std::wstring stringToWstring(const std::string& strInput) {if (strInput.empty()){return L"";}std::string strLocale = setlocale(LC_ALL, "");const char* pSrc = strInput.c_str();unsigned int iDestSize = mbstowcs(NULL, pSrc, 0) + 1;wchar_t* szDest = new wchar_t[iDestSize];wmemset(szDest, 0, iDestSize);mbstowcs(szDest, pSrc, iDestSize);std::wstring wstrResult = szDest;delete[]szDest;setlocale(LC_ALL, strLocale.c_str());return wstrResult;
}int main()
{std::vector<std::string> lps;lps.emplace_back("鲁A12345");lps.emplace_back("SA12345");lps.emplace_back("鲁AD12345");lps.emplace_back("鲁AD12");lps.emplace_back("鲁AD#1234");std::wstring wstr;std::wregex reg(L"^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[ABCDEFGHJKLMNPQRSTUVWXY]{1}[ABCDEFGHJKLNMxPQRSTUVWXYZ 0-9]{4}[ABCDEFGHJKLNMxPQRSTUVWXYZ 0-9挂学警港澳]{1}$");std::wregex regNew(L"^[京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新]{1}[ABCDEFGHJKLMNPQRSTUVWXY]{1}[1-9DF]{1}[1-9ABCDEFGHJKLMNPQRSTUVWXYZ]{4}[1-9DF]$");for(std::string str: lps){wstr = stringToWstring(str.c_str());std::wsmatch match;bool ret = std::regex_match(wstr, match, reg);if (ret){std::cout << str << "匹配成功,是常规车牌、军牌" << std::endl;}else{ret = std::regex_match(wstr, match, regNew);if (ret){std::cout << str << "匹配成功,是新能源车牌" << std::endl;}else{std::cout << str << "匹配失败,不是车牌号" << std::endl;}}}
}

运行结果:

  • 注意:程序没有经过严格的测试,正则表达式写的不是很完美,欢迎批评指正。

c++11 regex 正则表达式验证车牌号相关推荐

  1. js 验证车牌号(含新能源)合法性

    function isVehicleNumber(vehicleNumber) {var xreg=/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1 ...

  2. java 车牌号验证正则表达式_车牌号校验正则表达式

    标签: 一.车牌号校验规则 1.常规车牌号:仅允许以汉字开头,后面可录入六个字符,由大写英文字母和阿拉伯数字组成.如:粤B12345: 2.武警车牌:允许前两位为大写英文字母,后面可录入五个或六个字符 ...

  3. java 车牌正则表达式_车牌号校验正则表达式

    一.车牌号校验规则 1.常规车牌号:仅允许以汉字开头,后面可录入六个字符,由大写英文字母和阿拉伯数字组成.如:粤B12345: 2.最后一个为汉字的车牌:允许以汉字开头,后面可录入六个字符,前五位字符 ...

  4. 正则表达式 手机号 车牌号 身份证 姓名

    Android中手机号.车牌号正则表达式 手机号 手机号的号段说明转载自:国内手机号码的正则表达式|蜗牛的积累 手机名称有GSM:表示只支持中国联通或者中国移动2G号段(130.131.132.134 ...

  5. python正则表达式完成车牌号检验

    正则表达式:对于车牌而言,选用的正则表达式是"^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼A-Z]{1}[A-Z]{1}\s{1}[A-Z0-9]{4}[A-Z0-9挂 ...

  6. java 车牌号正则_js 正则表达式 判断车牌号

    1.常规车牌号:仅允许以汉字开头,后面可录入六个字符,由大写英文字母和阿拉伯数字组成.如:粤B12345: 2.武警车牌:允许前两位为大写英文字母,后面可录入七个字符,由大写英文字母和阿拉伯数字组成, ...

  7. PHP 正则验证车牌号、判断车牌号是否合法

    /** Notes: 判断车牌号是否合法* @param: $license 车牌号* return bool true:合法 false:不合法*/ public function isCarLic ...

  8. java 车牌号验证正则表达式_使用正则表达式验证手机号、车牌号

    1.javascript验证手机号 function checkPhone(){ var sPhone = document.getElementById("id").value ...

  9. iOS开发正则表达式,验证是否是邮箱,手机号,银行卡号,URL等等

    这里是用的类扩展,封装了验证是否是邮箱,手机号,工商税号,身份证号,链接,车牌号等等功能. .h文件 #import <Foundation/Foundation.h> @interfac ...

最新文章

  1. 为何Google将几十亿行源代码放在一个仓库?| CSDN博文精选
  2. 用Selenium 爬虫下载文件,解除Chrome 下载警告 (Keep or Discard),设置下载目录的方法
  3. “五心”知“五感”,平安打造有温度的智慧城市
  4. 启动“powershell.exe”时出现错误 0x8007000
  5. python中ndarray对象实例化_Python数据分析之Numpy学习 2——NumPy 基础 ndarray对象
  6. 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
  7. svn 备份和还原项目
  8. jQuery实现文本框回车键转tab键
  9. 高德地图轨迹方向_阿里巴巴高德地图首席科学家任小枫:高精算法推动高精地图落地...
  10. 黑马程序员—黑客与画家——工作3年再转型(附赠大绝招)
  11. 信号预处理电路(三角波和正弦波转换成方波)
  12. 大数据的七大核心具体价值
  13. 《如何有效阅读一本书》:读再多书,不如先学会如何读书
  14. html如何开发影音播放器app,js HTML5多媒体影音播放
  15. tableau的动态参数和横向对比堆叠柱形图
  16. 网络安全风险与防范方法
  17. 一个Callable接口能有多少知识点?在裁员的大背景下,我仍然吊打了大厂面试官
  18. java好学么_java是什么好学吗?难不难学?
  19. Google支付相关
  20. 微信小程序隐私保护指引设置

热门文章

  1. Unity-托管代码剥离(link.xml使用)
  2. 2022深圳IVD诊断试剂临床检验医学展会
  3. 深度学习/计算机视觉学习资料
  4. 使用Vue3+Element Plus开发Chrome插件
  5. PDF格式分析(二十三)Action动作
  6. Video Input with OpenCV and similarity measurement(使用opencv测量两个视频的相似度)
  7. 使用python在雅虎财经提取数据的创捷有效边界
  8. AI大数据竞赛平台和网站
  9. 如何在线下载无水印视频
  10. 侯捷C++->组合与继承