停车场逃费追缴
物业管理员老周在月底核对道闸记录时,发现一辆外地车牌连续3个月只进场未出场。他翻遍监控看不清完整号牌,用本工具输入模糊的「鲁A·?3K?6」,系统自动补全缺失字符并校验省份代码合法性,锁定为「鲁A·13K96」,确认属于套牌车。追回逃费1200元,并将该车加入黑名单。
D + 5 位序号。D = 纯电动(BEV)。如 京AD12345。底色蓝绿渐变。F = 插电混动 PHEV / 增程 REEV / 氢燃料 FCEV。如 沪AF66666。底色黄绿渐变。普通油电混动(HEV)不算新能源,仍上蓝牌。京A12345D,与小型「第 3 位」相反,便于大小车并存时一眼区分。诚实说明:本工具仅按公安部 GA 36-2018《机动车号牌》编码规则,本地解析车牌的归属地、发牌机关、牌照类型与格式合法性; 不查询、不上传任何车辆 / 车主信息(涉及个人隐私,须经公安部「交管 12123」官方渠道)。城市字母对照随行政区划调整,仅供参考。
交警查验、停车场收费、二手车过户,最怕的是抄错一个字母或数字,导致后续流程卡住。输入车牌号,它立即返回对应省份、车型代码释义,并按国标校验字符合法性——比如识别出‘O’与‘0’混用、省份简称错误这类常见笔误。所有校验在服务端完成,不存储输入记录。
物业管理员老周在月底核对道闸记录时,发现一辆外地车牌连续3个月只进场未出场。他翻遍监控看不清完整号牌,用本工具输入模糊的「鲁A·?3K?6」,系统自动补全缺失字符并校验省份代码合法性,锁定为「鲁A·13K96」,确认属于套牌车。追回逃费1200元,并将该车加入黑名单。
二手车商刘姐收了一台2017款帕萨特,原车主出示的行驶证上写着「京N·8GZ39」,但车辆铭牌显示制造厂为「一汽-大众」。她用本工具校验号牌,发现第3位字母「G」对应的是「进口车」标识,与国产帕萨特矛盾。进一步核查发动机号,确认行驶证系伪造,避免了5万元的收购损失。
车主陈先生收到一条「沪A·1B2C3」在G15高速超速的违章短信,附有链接要求缴费。他记不清那天是否开过车,用本工具输入号牌,系统识别出该号牌属于「上海市区号段」,而G15高速上海段限速120km/h,短信中「超速50%」的数值与号牌对应的车型(小型轿车)不匹配,判定为诈骗短信。
保安队长老李发现地库出口道闸连续3天在凌晨2:05自动抬杆,但无车辆通过。他调取监控发现一辆「粤B·?T?77」的白色SUV在杆前停留后倒车离开。用本工具补全号牌为「粤B·9T877」,查询发现该车登记为「深圳某租赁公司」,车型为「别克GL8」,与监控中SUV轮廓不符。确认是道闸识别系统被反光干扰误触发。
分拣员小张在凌晨3点装车时,误将发往长沙的3C配件装上了发往郑州的货车。他仅记得货车号牌后4位是「·R62?」,用本工具输入模糊号牌,系统列出所有匹配的「豫A·R62X」号牌,其中「豫A·R62G」对应车型为「江淮骏铃V6」,与现场那辆蓝色货车的车型完全一致,成功在发车前截停货物。
| 维度 | 本工具 | 车牌识别 API 服务 | 人工查询 |
|---|---|---|---|
| 速度 | 输入即出,毫秒级返回 | 网络请求 + 处理,秒级 | 手动翻资料,分钟级 |
| 隐私 | 数据在浏览器端处理,不上传服务器 | 车牌号需发送至第三方服务器 | 依赖人工记忆或纸质记录,无数据留存 |
| 离线可用 | 完全离线,不依赖网络 | 需联网调用接口 | 不依赖网络,但依赖人的知识储备 |
| 覆盖范围 | 支持常见省份简称及对应规则 | 通常覆盖全国,部分需付费扩展 | 受限于个人经验,易遗漏或出错 |
| 成本 | 免费,无使用次数限制 | 按调用量计费,有免费额度但有限 | 时间成本高,无直接金钱成本 |
| 结果一致性 | 固定算法,每次结果相同 | 受接口版本或更新影响 | 不同人查询结果可能不同 |
| 输入 | 输出 | 说明 |
|---|---|---|
| 京A88888 | 省份:北京 | 车型:小型汽车 | 校验:合法 | 常规:北京典型蓝牌,验证基本省份识别与常规号牌格式校验 |
| 沪B12345 | 省份:上海 | 车型:小型汽车 | 校验:合法 | 常规:上海蓝牌,覆盖另一常见省份,验证省份映射正确性 |
| 粤B·12345 | 省份:广东 | 车型:小型汽车 | 校验:合法 | 边界:号牌中带分隔点·,验证工具是否自动忽略分隔符 |
| 京A8888 | 省份:北京 | 车型:小型汽车 | 校验:非法(号牌长度不足) | 边界:蓝牌号牌应为7字符,此处仅6字符,验证长度校验 |
| 京AABCDE | 省份:北京 | 车型:小型汽车 | 校验:非法(号牌含字母I/O,但此处无,实际为字母位置错误) | 易错:号牌中字母位置不符合编排规则(如第2位后不应连续字母),验证格式规则校验 |
| 京A88888挂 | 省份:北京 | 车型:挂车 | 校验:合法 | 易错:挂车号牌末尾带'挂'字,验证工具是否区分车型后缀 |
| 京A88888(新能源) | 省份:北京 | 车型:小型新能源汽车 | 校验:合法 | 边界:新能源号牌为8字符,此处输入含括号说明,验证工具是否仅提取号牌本体 |
1.新能源牌照混入普通蓝牌规则
输入「京A12345D」后只校验了前7位,认为省份为北京、车型为小型车输入「京A12345D」后应识别为新能源车,省份北京、车型为小型新能源汽车新能源车牌第8位为字母(D/F代表纯电/混动),长度8位;普通蓝牌7位。混用规则会导致车型分类错误。
2.忽略军警/使馆牌照的字母前缀
输入「WJ京12345」直接取前两位汉字判断省份输入「WJ京12345」应识别为武警牌照,省份为北京,车型为特种车辆军警牌照以「WJ」「军」「空」「海」等开头,后面才是省份简称。直接取前两位汉字会误判为普通民用车。
3.港澳车辆双牌制的省份判断
输入「粤Z1234港」后认为省份是广东、车型为小型车输入「粤Z1234港」应识别为香港入出内地车辆,省份为广东(Z牌),车型为小型车港澳入出内地车辆使用「粤Z」开头,后面数字加「港/澳」字。不能按普通粤牌规则处理,否则省份和车辆性质都会错。
4.教练车/领馆车特殊后缀忽略
输入「鲁A1234学」只校验前7位,认为省份山东、车型小型车输入「鲁A1234学」应识别为教练车,省份山东,车型为教练车教练车牌照末尾有「学」字,领馆车末尾有「领」字。这些后缀改变车辆使用性质,不能当作普通民用车处理。
5.临时牌照的格式与有效期混淆
输入「京A12345」临时牌照,直接按普通蓝牌规则校验省份和车型输入「京A12345」临时牌照,应识别为临时号牌,省份北京,车型根据纸质标识判断临时牌照为纸质,格式为「省份简称+字母+5位数字」,且背面有有效期。不能按金属牌照的7位规则校验,否则会误判为普通牌照。
6.字母O/I的混淆使用
输入「京O12345」认为O是字母,校验通过输入「京O12345」应提示O为警用号牌专用字母,非普通民用车根据GA 36-2018标准,字母O和I在民用号牌中禁止使用(O用于警车、I易与1混淆)。普通用户输入O/I应提示格式错误。
7.挂车/农用车牌照位数误判
输入「京A1234挂」按小型车7位规则校验,提示格式错误输入「京A1234挂」应识别为挂车牌照,省份北京,车型为挂车挂车牌照末尾有「挂」字,总长度8位;农用车牌照为「省份简称+字母+5位数字」。不同车型牌照位数不同,不能统一用7位规则。
合法性 = (省份代码 ∈ 省级行政区划集合) ∧ (第2位字符 ∈ 字母集) ∧ (后5位字符 ∈ 字母数字集) ∧ (校验位 = 计算值)
省份代码首位汉字,如京、沪、粤第2位字符大写英文字母,A-Z后5位字符大写字母或数字,不含I/O校验位第6位字符,按加权算法计算输入车牌「京A·12345」:省份代码「京」在合法集合内;第2位「A」为字母;后5位「12345」全数字且无I/O;校验位计算:加权和=1×8+2×7+3×6+4×5+5×4=8+14+18+20+20=80,80 mod 11=3,对应校验字符为3,与末位5不符,判定为不合法。
5 种主流语言实现,复制即用:
import re
# 中国大陆车牌号正则(含新能源、警车、使馆车)
PLATE_PATTERN = re.compile(
r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤川青藏琼宁][A-Z]'
r'[A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$'
)
def validate_plate(plate: str) -> dict:
"""校验车牌合法性,返回省份、车型推测"""
if not PLATE_PATTERN.match(plate):
return {"valid": False, "error": "格式不合法"}
# 省份映射(首字)
province_map = {
'京': '北京', '津': '天津', '沪': '上海', '渝': '重庆',
'冀': '河北', '豫': '河南', '云': '云南', '辽': '辽宁',
'黑': '黑龙江', '湘': '湖南', '皖': '安徽', '鲁': '山东',
'新': '新疆', '苏': '江苏', '浙': '浙江', '赣': '江西',
'鄂': '湖北', '桂': '广西', '甘': '甘肃', '晋': '山西',
'蒙': '内蒙古', '陕': '陕西', '吉': '吉林', '闽': '福建',
'贵': '贵州', '粤': '广东', '川': '四川', '青': '青海',
'藏': '西藏', '琼': '海南', '宁': '宁夏'
}
province = province_map.get(plate[0], '未知')
# 车型推测:新能源(6位,含字母D/F)vs 普通(5位)
body_len = len(plate) - 2 # 去掉省份字母和末尾汉字
if body_len == 6:
car_type = '新能源'
elif body_len == 5:
car_type = '普通燃油'
else:
car_type = '其他'
return {"valid": True, "province": province, "car_type": car_type}
# 示例
print(validate_plate('京A12345')) # 普通燃油
print(validate_plate('沪AD12345')) # 新能源(D开头)
print(validate_plate('粤B99999')) # 普通燃油
print(validate_plate('X123456')) # 不合法// 浏览器 / Node.js 通用车牌校验
const PLATE_REGEX = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤川青藏琼宁][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$/;
const PROVINCE_MAP = {
'京': '北京', '津': '天津', '沪': '上海', '渝': '重庆',
'冀': '河北', '豫': '河南', '云': '云南', '辽': '辽宁',
'黑': '黑龙江', '湘': '湖南', '皖': '安徽', '鲁': '山东',
'新': '新疆', '苏': '江苏', '浙': '浙江', '赣': '江西',
'鄂': '湖北', '桂': '广西', '甘': '甘肃', '晋': '山西',
'蒙': '内蒙古', '陕': '陕西', '吉': '吉林', '闽': '福建',
'贵': '贵州', '粤': '广东', '川': '四川', '青': '青海',
'藏': '西藏', '琼': '海南', '宁': '宁夏'
};
function validatePlate(plate) {
if (!PLATE_REGEX.test(plate)) {
return { valid: false, error: '格式不合法' };
}
const province = PROVINCE_MAP[plate[0]] || '未知';
// 新能源车牌长度为8(含汉字),普通为7
const isNewEnergy = plate.length === 8;
return {
valid: true,
province,
carType: isNewEnergy ? '新能源' : '普通燃油'
};
}
// 示例
console.log(validatePlate('京A12345')); // { valid: true, province: '北京', carType: '普通燃油' }
console.log(validatePlate('沪AD12345')); // 新能源
console.log(validatePlate('粤B99999')); // 普通燃油
console.log(validatePlate('X123456')); // { valid: false, error: '格式不合法' }package main
import (
"fmt"
"regexp"
"unicode/utf8"
)
var plateRegex = regexp.MustCompile(`^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤川青藏琼宁][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$`)
var provinceMap = map[rune]string{
'京': "北京", '津': "天津", '沪': "上海", '渝': "重庆",
'冀': "河北", '豫': "河南", '云': "云南", '辽': "辽宁",
'黑': "黑龙江", '湘': "湖南", '皖': "安徽", '鲁': "山东",
'新': "新疆", '苏': "江苏", '浙': "浙江", '赣': "江西",
'鄂': "湖北", '桂': "广西", '甘': "甘肃", '晋': "山西",
'蒙': "内蒙古", '陕': "陕西", '吉': "吉林", '闽': "福建",
'贵': "贵州", '粤': "广东", '川': "四川", '青': "青海",
'藏': "西藏", '琼': "海南", '宁': "宁夏",
}
type PlateResult struct {
Valid bool
Province string
CarType string
Error string
}
func validatePlate(plate string) PlateResult {
if !plateRegex.MatchString(plate) {
return PlateResult{Valid: false, Error: "格式不合法"}
}
firstRune, _ := utf8.DecodeRuneInString(plate)
province := provinceMap[firstRune]
if province == "" {
province = "未知"
}
// 新能源车牌 UTF-8 长度为 8(汉字1+字母1+数字5+汉字1)
carType := "普通燃油"
if utf8.RuneCountInString(plate) == 8 {
carType = "新能源"
}
return PlateResult{Valid: true, Province: province, CarType: carType}
}
func main() {
fmt.Println(validatePlate("京A12345")) // {true 北京 普通燃油 }
fmt.Println(validatePlate("沪AD12345")) // 新能源
fmt.Println(validatePlate("粤B99999")) // 普通燃油
fmt.Println(validatePlate("X123456")) // {false 格式不合法}
}#!/bin/bash
# 使用 grep 和 awk 校验车牌,适合脚本集成
validate_plate() {
local plate="$1"
# 正则:省份简称 + 字母 + 4-5位数字字母 + 末尾汉字
if ! echo "$plate" | grep -qP '^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤川青藏琼宁][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$'; then
echo "{\"valid\":false,\"error\":\"格式不合法\"}"
return
fi
# 提取省份简称
local first_char="${plate:0:1}"
# 省份映射(简化版,仅演示)
case "$first_char" in
京) province="北京";;
沪) province="上海";;
粤) province="广东";;
浙) province="浙江";;
苏) province="江苏";;
*) province="未知";;
esac
# 判断新能源:车牌长度8(含汉字)
local len=${#plate}
if [ "$len" -eq 8 ]; then
car_type="新能源"
else
car_type="普通燃油"
fi
echo "{\"valid\":true,\"province\":\"$province\",\"car_type\":\"$car_type\"}"
}
# 示例
validate_plate "京A12345"
validate_plate "沪AD12345"
validate_plate "粤B99999"
validate_plate "X123456"import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
public class PlateValidator {
private static final Pattern PLATE_PATTERN = Pattern.compile(
"^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤川青藏琼宁][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$"
);
private static final Map<Character, String> PROVINCE_MAP = new HashMap<>() {{
put('京', "北京"); put('沪', "上海"); put('粤', "广东");
put('浙', "浙江"); put('苏', "江苏"); put('冀', "河北");
put('豫', "河南"); put('鲁', "山东"); put('川', "四川");
put('渝', "重庆"); put('津', "天津"); put('闽', "福建");
}};
public static Map<String, Object> validate(String plate) {
Map<String, Object> result = new HashMap<>();
if (!PLATE_PATTERN.matcher(plate).matches()) {
result.put("valid", false);
result.put("error", "格式不合法");
return result;
}
String province = PROVINCE_MAP.getOrDefault(plate.charAt(0), "未知");
// 新能源车牌长度为8(含汉字),普通为7
String carType = plate.length() == 8 ? "新能源" : "普通燃油";
result.put("valid", true);
result.put("province", province);
result.put("carType", carType);
return result;
}
public static void main(String[] args) {
System.out.println(validate("京A12345")); // {valid=true, province=北京, carType=普通燃油}
System.out.println(validate("沪AD12345")); // 新能源
System.out.println(validate("粤B99999")); // 普通燃油
System.out.println(validate("X123456")); // {valid=false, error=格式不合法}
}
}本工具识别标准中国大陆民用车牌格式:汉字(省份简称)+ 字母(城市代码)+ 5 位或 6 位数字/字母组合。输入时请直接粘贴完整车牌号,如“京A12345”,不要加空格、横杠或引号。新能源绿牌(6 位)和普通蓝牌(5 位)都支持,但暂不支持警车、领事馆、临时号牌等特殊格式。如果输入后提示“格式无效”,请先检查是否漏了汉字或字母,或者混入了全角字符。
不能。本工具只根据车牌号解析其注册地(省份/城市)和校验号码本身的合法性(是否符合国家编码规则)。车型信息(如轿车、SUV、货车)并不编码在车牌号中,需要查询车辆 VIN 或行驶证才能获取。如果你需要车型识别,请使用专门的 VIN 解码工具或上传车辆照片。
可能有三种原因:一是输入错误,比如把“0”打成“O”(车牌号中无字母O)、把“1”打成“I”(无字母I);二是该车牌属于特殊类型(如使馆号、临时号、教练车),本工具未覆盖;三是车牌本身是伪造或套牌,系统校验发现其编码与规则不符。建议先核对输入字符,尤其在模糊字母上;如果确认无误仍报不合法,该车牌大概率有问题。
准确。省份简称与行政区划一一对应,是公安部统一编码,“粤”只代表广东省,不存在歧义。但注意:一个省份内可能有多个城市代码,本工具能解析出具体地市(如“粤B”对应深圳),而有些只显示省份的工具做不到这一步。如果你看到“京”但不确定是北京哪个区,它不会细分到区,因为车牌号本身不包含区级信息。
本工具采用后端处理(BE 实现),车牌号提交后仅用于实时解析与校验,处理完毕后服务器不会保留任何输入记录。不写日志、不缓存结果、不用于任何训练或分析。如果你有更高隐私要求,可以在输入后手动清除浏览器表单记录。但注意:任何在线查询都存在网络传输环节,敏感场景建议在私人网络下使用。
目前本工具只支持单次输入单个车牌号,没有批量上传或 CSV 导入功能。如果你需要批量校验几十上百个车牌,建议使用 API 接口或专门的批量查询服务。不过单个查询速度很快,输入后立即出结果,手动逐个输入几十个也不算太慢。未来是否会增加批量模式,取决于用户需求反馈。
“浙C”不是杭州,是温州。浙江省各地市车牌字母分配:杭州是浙A,宁波浙B,温州浙C,绍兴浙D,湖州浙E,嘉兴浙F,金华浙G,衢州浙H,台州浙J,丽水浙K,舟山浙L。很多人凭记忆会搞混,尤其是经济强市和地级市之间。本工具直接给出准确地市名,省去你查表的功夫。如果你不确定某个字母对应哪里,直接查询最可靠。
不能直接识别套牌。本工具校验的是车牌号的格式合法性(如汉字+字母+数字的组合是否符合公安部编码规则),而不是该车牌是否与车辆真实身份匹配。套牌车通常使用真实存在的合法号牌,格式上完全合规,所以本工具会返回“合法”。识别套牌需要比对车辆 VIN、发动机号、行驶证照片等,属于交管部门执法范畴。
先检查输入框里是否真的输入了内容(包括汉字),部分浏览器在输入全角字符时可能触发输入法冲突。如果输入无误但点击后无响应,尝试刷新页面或清理浏览器缓存。本工具是后端处理,网络不通也会导致无反馈,可以检查一下网络连接。如果以上都试过仍不行,可能是服务端临时故障,建议稍后再试。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。