Validador de placa de veículo
Digite a placa e veja na hora se está no padrão antigo ou Mercosul, o que está errado e como ela fica no formato Mercosul.
A validação confere apenas o formato das 7 posições. Ela não consulta o Detran/Senatran, então não diz se a placa foi emitida nem a quem pertence.
Processamento local: nada do que você digita sai do seu navegador.
Como usar
Digite a placa com ou sem hífen, em maiúsculas ou minúsculas. O resultado aparece enquanto você digita, indicando o tipo e, se algo estiver errado, qual posição quebra o padrão. O botão Usar exemplo válido alterna entre placas dos dois tipos.
Padrão antigo x Mercosul
O padrão antigo tem 3 letras e 4 números (ABC-1234). O Mercosul, adotado no Brasil a partir de 2018, tem 3 letras, 1 número, 1 letra e 2 números (ABC1D23), sem hífen. A placa antiga convertida para Mercosul mantém as letras e os números, e a 2ª posição numérica (a 5ª da placa) vira uma letra: 0=A, 1=B, 2=C ... 9=J. Assim ABC-1234 corresponde a ABC1C34.
A conversão é uma convenção de equivalência de formato. A placa efetiva de um veículo é a que consta no documento emitido pelo Detran. Esta ferramenta não consulta nenhuma base oficial.
Como implementar em código
Exemplos prontos para usar no seu projeto.
// Placa: antiga ABC-1234 ou Mercosul ABC1D23
function placaValida(valor) {
const p = String(valor).toUpperCase().replace(/[\s-]/g, '');
return /^[A-Z]{3}\d{4}$/.test(p) || /^[A-Z]{3}\d[A-Z]\d{2}$/.test(p);
}
// Antiga -> Mercosul: o 2º dígito do número vira letra (0=A, 1=B ... 9=J)
function paraMercosul(valor) {
const p = String(valor).toUpperCase().replace(/[\s-]/g, '');
if (!/^[A-Z]{3}\d{4}$/.test(p)) return null;
return p.slice(0, 4) + 'ABCDEFGHIJ'[Number(p[4])] + p.slice(5);
}
console.log(placaValida('ABC-1234'), paraMercosul('ABC-1234')); // true ABC1C34import re
ANTIGA = re.compile(r"[A-Z]{3}\d{4}")
MERCOSUL = re.compile(r"[A-Z]{3}\d[A-Z]\d{2}")
def _limpa(valor: str) -> str:
return re.sub(r"[\s-]", "", valor.upper())
def placa_valida(valor: str) -> bool:
"""Placa antiga (ABC-1234) ou Mercosul (ABC1D23)."""
p = _limpa(valor)
return bool(ANTIGA.fullmatch(p) or MERCOSUL.fullmatch(p))
def para_mercosul(valor: str):
"""Antiga -> Mercosul: o 2º dígito do número vira letra (0=A ... 9=J)."""
p = _limpa(valor)
if not ANTIGA.fullmatch(p):
return None
return p[:4] + "ABCDEFGHIJ"[int(p[4])] + p[5:]
print(placa_valida("ABC-1234"), para_mercosul("ABC-1234")) # True ABC1C34import (
"regexp"
"strings"
)
var (
reAntiga = regexp.MustCompile(`^[A-Z]{3}\d{4}$`)
reMercosul = regexp.MustCompile(`^[A-Z]{3}\d[A-Z]\d{2}$`)
)
func limpaPlaca(v string) string {
return strings.ToUpper(strings.NewReplacer(" ", "", "-", "").Replace(v))
}
// PlacaValida aceita o padrão antigo (ABC-1234) e o Mercosul (ABC1D23).
func PlacaValida(valor string) bool {
p := limpaPlaca(valor)
return reAntiga.MatchString(p) || reMercosul.MatchString(p)
}
// ParaMercosul converte placa antiga: o 2º dígito do número vira letra (0=A ... 9=J).
// Retorna "" se a placa não estiver no padrão antigo.
func ParaMercosul(valor string) string {
p := limpaPlaca(valor)
if !reAntiga.MatchString(p) {
return ""
}
return p[:4] + string("ABCDEFGHIJ"[p[4]-'0']) + p[5:]
}final _antiga = RegExp(r'^[A-Z]{3}\d{4}$');
final _mercosul = RegExp(r'^[A-Z]{3}\d[A-Z]\d{2}$');
String _limpa(String v) => v.toUpperCase().replaceAll(RegExp(r'[\s-]'), '');
/// Placa antiga (ABC-1234) ou Mercosul (ABC1D23).
bool placaValida(String valor) {
final p = _limpa(valor);
return _antiga.hasMatch(p) || _mercosul.hasMatch(p);
}
/// Antiga -> Mercosul: o 2º dígito do número vira letra (0=A ... 9=J).
String? paraMercosul(String valor) {
final p = _limpa(valor);
if (!_antiga.hasMatch(p)) return null;
return p.substring(0, 4) + 'ABCDEFGHIJ'[int.parse(p[4])] + p.substring(5);
}final class Validador {
private static String limpa(String v) {
return v.toUpperCase().replaceAll("[\\s-]", "");
}
/** Placa antiga (ABC-1234) ou Mercosul (ABC1D23). */
static boolean placaValida(String valor) {
String p = limpa(valor);
return p.matches("[A-Z]{3}\\d{4}") || p.matches("[A-Z]{3}\\d[A-Z]\\d{2}");
}
/** Antiga -> Mercosul: o 2º dígito do número vira letra (0=A ... 9=J). Null se não for antiga. */
static String paraMercosul(String valor) {
String p = limpa(valor);
if (!p.matches("[A-Z]{3}\\d{4}")) return null;
return p.substring(0, 4) + "ABCDEFGHIJ".charAt(p.charAt(4) - '0') + p.substring(5);
}
}<?php
// Placa: antiga ABC-1234 ou Mercosul ABC1D23
function placaValida(string $valor): bool {
$p = strtoupper(preg_replace('/[\s-]/', '', $valor));
return preg_match('/^[A-Z]{3}\d{4}$/', $p) === 1
|| preg_match('/^[A-Z]{3}\d[A-Z]\d{2}$/', $p) === 1;
}
// Antiga -> Mercosul: o 2º dígito do número vira letra (0=A ... 9=J)
function paraMercosul(string $valor): ?string {
$p = strtoupper(preg_replace('/[\s-]/', '', $valor));
if (!preg_match('/^[A-Z]{3}\d{4}$/', $p)) return null;
return substr($p, 0, 4) . 'ABCDEFGHIJ'[(int)$p[4]] . substr($p, 5);
}using System.Text.RegularExpressions;
public static class Validador
{
static string Limpa(string v) => Regex.Replace(v.ToUpperInvariant(), @"[\s-]", "");
// Placa antiga (ABC-1234) ou Mercosul (ABC1D23)
public static bool PlacaValida(string valor)
{
var p = Limpa(valor);
return Regex.IsMatch(p, @"^[A-Z]{3}\d{4}$") || Regex.IsMatch(p, @"^[A-Z]{3}\d[A-Z]\d{2}$");
}
// Antiga -> Mercosul: o 2º dígito do número vira letra (0=A ... 9=J). Null se não for antiga.
public static string ParaMercosul(string valor)
{
var p = Limpa(valor);
if (!Regex.IsMatch(p, @"^[A-Z]{3}\d{4}$")) return null;
return p.Substring(0, 4) + "ABCDEFGHIJ"[p[4] - '0'] + p.Substring(5);
}
}Perguntas frequentes
Placa tem dígito verificador?
Não. Placas brasileiras não têm dígito verificador; a validação só confere se o formato (letras e números nas posições certas) está correto.
Como uma placa antiga vira Mercosul?
Mantêm-se as 3 letras e o primeiro número, e a 2ª posição numérica passa a ser letra (0=A até 9=J). Exemplo: ABC-1234 vira ABC1C34.
A ferramenta diz se a placa existe?
Não. Ela só verifica o formato. Para saber se a placa existe ou a quem pertence é preciso consultar um serviço oficial autorizado.
Veja também
Precisa de um sistema ou app sob medida?
A VcInova desenvolve software, aplicativos e integrações para empresas de todo o Brasil.
Fale com a VcInova