Ferramentas / Validador de placa de veículo

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 ABC1C34
    import 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 ABC1C34
    import (
    	"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