车牌号正则校验

3,978 阅读2分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

项目开发中遇到了车牌号正则验证的需求,自己开始琢磨起来。本以为查查资料很快能写出来,但正则基础薄弱的我折腾了半天。让我重拾起学习正则的信心。参考了网上零散的规则与掘金上大佬的系统文章正则表达式完整教程(略长),算是入门可以写出车牌的需求了。
这里就从车牌号的正则验证来说起。
规则:

  • 汽车分油车,纯电动车,油电混合车。油车的车牌长度位7位,纯电动车与油电混合车车位长度胃8位
const len = plateNo.length;
// 位数校验
if (len !== 7 && len !== 8) return false;
  • 车牌号第一位代表省份,所择在省的简称,有:京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼 这31个省份,所有第一位必须是这31个省份中的第一位,正则是:
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼]{1}/
  • 车牌号第二位代表代表该车所在地的地市一级代码,由26个英文字母,不包含I,O. 为的是和数字区分。即A-H,J-N,P-Z, 正则是:
/[A-HJ-NP-Z]{1}/
  • 油车,后5位,由0-9数字,A-H,J-N,P-Z,字母组成,字母数量不超过2位。规则是:
/([A-HJ-NP-Z0-9]{5})/
// 字母不超过2位
const arr = plateNo.slice(2).match(/[A-HJ-NP-Z]/g);
if (arr.length > 2) return false;
  • 纯电动车,油电混合车,后6位,情况多种
    • 纯数字
    /[0-9]{6}/
    
    • 1个随机字母 + 5个随机数字
    /[A-HJ-NP-Z]{1}[0-9]{5}/
    
    • 5个随机数字 + 1个随机字母
    /[0-9]{5}[A-HJ-NP-Z]{1}/
    
    • 2个随机字母 + 4个随机数字
    /[A-HJ-NP-Z]{2}[0-9]{4})/
    

综合一下,完整版函数:

 * 车牌号校验
 * @param {string} plateNo 车牌号
 * @returns {boolean} 是否符合车牌号规则 true:符合 false:不符合
 */
function checkPlateNumberFormat(plateNo: string) {
  if (!plateNo) return false;
  const len = plateNo.length;
  // 位数校验
  if (len !== 7 && len !== 8) return false;
  // 车牌号规则校验
  const PLATE_NO_PATTERN = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼]{1}[A-HJ-NP-Z]{1}(([A-HJ-NP-Z0-9]{5})|([0-9]{6}|[A-HJ-NP-Z]{1}[0-9]{5}|[0-9]{5}[A-HJ-NP-Z]{1}|[A-HJ-NP-Z]{2}[0-9]{4}))$/;
  if (PLATE_NO_PATTERN.test(plateNo)) {
    // 新能源车
    if (len === 8) return true;
    // 7位时,后5位最多包含2位字母校验
    const arr = plateNo.match(/[A-HJ-NP-Z]/g);
    if (arr.length <= 3) return true;
  }
  return false;
}