Placa de veículo

Placas de identificação veicular, nos padrões Mercosul (LLLNLNN) e pré-Mercosul (LLLNNNN).

  • Matriz de paridade

Validar

Valida uma placa no formato antigo (ABC1234) ou no padrão Mercosul (ABC1D23), em maiúsculas ou minúsculas, com ou sem hífen ou espaço.

  • options.format restringe a checagem a um formato: "LLLNNNN" (antigo, ABC1234) ou "LLLNLNN" (Mercosul, ABC1D23), os códigos que licensePlate.getFormat retorna e licensePlate.generate recebe. Sem ele, ou com qualquer outro valor, os dois formatos são aceitos. Até a 2.4.0 a opção não existia e os dois formatos eram sempre aceitos.
  • Qualquer outra sequência de letras e dígitos, ou caracteres a mais, torna a placa inválida.
  • A máscara (espaço, ., - ou /, sozinha ou em sequência) só é aceita entre o terceiro caractere e os quatro últimos, os espaços nas pontas da placa são ignorados, e a verificação ignora maiúsculas e minúsculas.
  • Um caractere de máscara em outro lugar, ou qualquer outro caractere (A@BC1234, um emoji), torna a placa inválida em vez de ser removido. Até a 2.4.0 esses caracteres eram removidos (A@B#C1$2%3^4 era true).
  • licensePlate.getFormat retorna null exatamente quando esta função retorna false.
  • A sequência antiga de motos, já extinta, LLLNNLN (ABC12D3) é inválida.
ParâmetroTipoObrigatório
valuestringsim
optionsIsValidLicensePlateOptionsnão
options.formatLicensePlateFormatnão
retornaboolean

Valida uma placa de veículo. Aceita o formato antigo brasileiro (ABC-1234) e o formato Mercosul (ABC1D23), com ou sem máscara, em maiúsculas ou minúsculas. A máscara (espaço, ., - ou /, isolados ou em sequência) só é aceita entre o terceiro caractere e os quatro últimos; qualquer outro caractere (@, um emoji, um separador em outra posição) invalida a placa em vez de ser removido.

A opção format do segundo argumento (IsValidLicensePlateOptions) restringe a validação a um deles: "LLLNNNN" para o formato antigo ou "LLLNLNN" para o Mercosul, os nomes que getFormatLicensePlate retorna. Funciona como o argumento type do is_valid da biblioteca Python, cujos valores lá se chamam "old_format" e "mercosul". Esses nomes não são formatos aqui: sem format, ou com qualquer outro valor, uma placa em qualquer um dos dois formatos é válida.

import { isValidLicensePlate } from '@brazilian-utils/brazilian-utils';

isValidLicensePlate('ABC1234'); // true (formato brasileiro)
isValidLicensePlate('ABC-1234'); // true (formato brasileiro com hífen)
isValidLicensePlate('ABC 1234'); // true (máscara com espaço)
isValidLicensePlate('ABC1D23'); // true (formato Mercosul)
isValidLicensePlate('ABC12D3'); // false (não é uma sequência Mercosul)
isValidLicensePlate('ABC1234EXTRA'); // false (caracteres em excesso)
isValidLicensePlate('A-BC1234'); // false (a máscara só fica depois do terceiro caractere)
isValidLicensePlate('ABC1234!'); // false (qualquer outro caractere é rejeitado)
isValidLicensePlate('ABC1D23', { format: 'LLLNLNN' }); // true
isValidLicensePlate('ABC1234', { format: 'LLLNLNN' }); // false (placa no formato antigo)
isValidLicensePlate('ABC-1234', { format: 'LLLNNNN' }); // true

Fonte: Resolução CONTRAN nº 969/2022, Anexos.

Código: brazilian-utils/javascript
Teste com JavaScript isValidLicensePlate
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (48) e o resultado em cada biblioteca licensePlate.isValid

Formatar

Formata uma placa em maiúsculas. Placas no formato antigo (LLLNNNN) ganham um hífen (ABC-1234). Placas Mercosul (LLLNLNN) não têm separador.

  • Um valor parcial é formatado até onde vai, então a função serve como máscara de entrada: o hífen aparece assim que o quarto caractere é um dígito (abc1 dá ABC-1), e um quinto caractere que é letra mantém a forma Mercosul (abc1d dá ABC1D).
  • Todo caractere que não seja letra ASCII ou dígito é descartado antes, e só os 7 primeiros ficam. Diferente de licensePlate.isValid, a máscara pode estar em qualquer posição.
  • Retorna uma string vazia quando o valor não pode ser o início de uma placa válida (1234567, abc12d3, abc1da2).
  • Um valor que não é string retorna uma string vazia.
ParâmetroTipoObrigatório
valuestringsim
retornastring

Formata uma placa. Placas antigas brasileiras (LLLNNNN) recebem hífen; placas Mercosul (LLLNLNN) são retornadas sem separador.

  • Retorna '' quando o valor não pode iniciar uma placa válida.
  • Um valor parcial é formatado progressivamente, então a função serve como máscara de entrada: o hífen aparece assim que o quarto caractere é um dígito, e um quinto caractere que é letra mantém a forma Mercosul.
import { formatLicensePlate } from '@brazilian-utils/brazilian-utils';

formatLicensePlate('abc1234'); // 'ABC-1234'
formatLicensePlate('abc1d23'); // 'ABC1D23'
formatLicensePlate('abc1'); // 'ABC-1' (um valor parcial é formatado até onde vai)
formatLicensePlate('abc1d'); // 'ABC1D'
Código: brazilian-utils/javascript
Teste com JavaScript formatLicensePlate
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (28) e o resultado em cada biblioteca licensePlate.format

Interpretar

Remove de uma placa todo caractere que não seja letra ASCII ou dígito, converte para maiúsculas e limita a 7 caracteres (abc-1234 dá ABC1234).

  • Não valida: use licensePlate.isValid para isso. A máscara pode estar em qualquer posição, diferente de licensePlate.isValid.
  • Um valor que não é string retorna uma string vazia.
ParâmetroTipoObrigatório
valuestringsim
retornastring

Remove separadores de uma placa, normaliza para letras maiúsculas e limita o resultado a 7 caracteres.

import { parseLicensePlate } from '@brazilian-utils/brazilian-utils';

parseLicensePlate('abc-1234'); // 'ABC1234'
Código: brazilian-utils/javascript
Teste com JavaScript parseLicensePlate
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (11) e o resultado em cada biblioteca licensePlate.parse

Gerar

Gera uma placa aleatória e válida, sem máscara.

  • format é LLLNLNN (Mercosul, o padrão) ou LLLNNNN (formato antigo). Qualquer outro valor usa o padrão.
  • O quinto caractere de uma placa Mercosul é sorteado de K a Z. A a J só é usado na conversão de uma placa do formato antigo (Resolução CONTRAN nº 969/2022, Anexo II, item 2), então uma placa nova nunca o traz. Até a 2.4.0 podia ser qualquer letra.
  • Um formato fora dos dois literais usa o padrão, então o resultado é sempre uma placa que licensePlate.isValid aceita. A 2.3.0 usava uma string desconhecida como veio.
  • Usa uma fonte aleatória não criptográfica.
ParâmetroTipoObrigatório
formatGenerateLicensePlateFormatnão
retornastring

Gera uma placa válida aleatória no formato escolhido.

  • format (GenerateLicensePlateFormat, um alias de LicensePlateFormat): 'LLLNLNN' (Mercosul, o padrão) ou 'LLLNNNN' (o formato antigo brasileiro). Qualquer outro valor cai no padrão.
  • A letra da quinta posição de uma placa Mercosul é sorteada de K a Z: A a J só são usadas para converter uma placa do formato antigo (Anexo II, item 2, da Resolução CONTRAN nº 969/2022), então uma placa nova nunca as tem.
import { generateLicensePlate } from '@brazilian-utils/brazilian-utils';

generateLicensePlate(); // 'ABC1K23' (Mercosul, o padrão)
generateLicensePlate('LLLNNNN'); // 'ABC1234'
generateLicensePlate('LLLNNLN'); // 'ABC1K23' (um formato fora dos dois em circulação cai no padrão)

Fonte: Resolução CONTRAN nº 969/2022.

Código: brazilian-utils/javascript
Teste com JavaScript generateLicensePlate
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (6) e o resultado em cada biblioteca licensePlate.generate

Convert to mercosul

Converte uma placa no formato antigo (LLLNNNN) para o padrão Mercosul (LLLNLNN). O 5º caractere, um dígito, vira uma letra, de 0 a 9 para A a J (ABC1234 vira ABC1C34). O resultado fica em maiúsculas e sem máscara.

A conversão segue a tabela do Anexo II da Resolução CONTRAN nº 969/2022. Todos os outros caracteres ficam como estão.

  • A placa é lida como licensePlate.isValid a lê: qualquer caixa, a máscara (ABC-1234, ABC 1234) aceita, espaços nas pontas ignorados, e um caractere de máscara ou qualquer outro caractere em outra posição a torna inválida. Até a 2.4.0 esses caracteres eram removidos, então A-BC1234 era convertida.
  • Retorna uma string vazia, não null, quando o valor não é uma placa válida no formato antigo: uma placa que já é Mercosul (ABC1D23), a sequência extinta LLLNNLN, um tamanho errado ou um valor inválido.

Decisão pendente

A referência (JS) também aceita a máscara com hífen (ABC-1234). As outras bibliotecas a rejeitam. Veja a decisão em aberto em docs/findings.md (em inglês).

Decisão pendente

Para uma placa que já é Mercosul ou que não é uma placa válida no formato antigo, a referência (JS) retorna uma string vazia. A maioria das bibliotecas retorna null. Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
valuestringsim
retornastring

Converte uma placa brasileira no formato antigo (LLLNNNN) para o formato Mercosul (LLLNLNN). O 5º dígito vira uma letra, 0 a 9 mapeados para A a J.

  • Retorna "" quando o valor não é uma placa válida no formato antigo.
import { convertLicensePlateToMercosul } from '@brazilian-utils/brazilian-utils';

convertLicensePlateToMercosul('ABC1234'); // 'ABC1C34'
convertLicensePlateToMercosul('abc-1234'); // 'ABC1C34'
convertLicensePlateToMercosul('ABC1D23'); // '' (já está no formato Mercosul)

Fonte: Resolução CONTRAN nº 969/2022, Anexo II.

Código: brazilian-utils/javascript
Teste com JavaScript convertLicensePlateToMercosul
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (20) e o resultado em cada biblioteca licensePlate.convertToMercosul

Get format

Detecta o formato de uma placa: LLLNNNN para o formato antigo, LLLNLNN para Mercosul.

  • A placa é lida como licensePlate.isValid a lê: qualquer caixa, espaços nas pontas ignorados, e a máscara (espaço, ., - ou /) aceita só entre o terceiro caractere e os quatro últimos. Um caractere de máscara em outro lugar, ou qualquer outro caractere, torna o valor inválido. Até a 2.4.0 esses caracteres eram removidos, então A-BC1234 dava LLLNNNN.
  • Retorna null quando o valor não tem 7 letras e dígitos em um dos dois formatos, inclusive a sequência extinta LLLNNLN.
  • Retorna null exatamente quando licensePlate.isValid retorna false.

Decisão pendente

Erlang retorna formatos com nome em vez dos padrões. Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
valuestringsim
retornaLicensePlateFormat | null

Detecta o formato normalizado de uma placa: 'LLLNNNN' para o formato antigo brasileiro, 'LLLNLNN' para o Mercosul.

  • Retorna null quando o valor, sem os separadores, não tem 7 letras e dígitos em um dos dois formatos.
  • Exporta o tipo LicensePlateFormat, que generateLicensePlate reexporta como GenerateLicensePlateFormat.
import { getFormatLicensePlate } from '@brazilian-utils/brazilian-utils';

getFormatLicensePlate('ABC-1234'); // 'LLLNNNN'
getFormatLicensePlate('ABC1D23'); // 'LLLNLNN'
getFormatLicensePlate('ABC12D3'); // null (não é uma sequência Mercosul)
getFormatLicensePlate('INVALID'); // null
getFormatLicensePlate('ABC1234EXTRA'); // null (caracteres em excesso)
Código: brazilian-utils/javascript
Teste com JavaScript getFormatLicensePlate
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (14) e o resultado em cada biblioteca licensePlate.getFormat

Especificação

Resumo

Placas de identificação veicular são as chapas dianteira e traseira fixadas no veículo. Uma placa tem 7 letras e dígitos.

Regras de validação

Padrão Mercosul

  1. A placa tem 7 letras e dígitos na sequência LLLNLNN.

Padrão pré-Mercosul

  1. A placa tem 7 letras e dígitos na sequência LLLNNNN, em dois grupos:
    • O primeiro grupo tem 3 letras (A a Z).
    • O segundo grupo tem 4 dígitos.

Algoritmo

  1. Remover os espaços no início e no fim, e os caracteres de máscara (espaço, ., - ou /, sozinhos ou em sequência) entre o terceiro caractere e os quatro últimos. Um caractere de máscara em outro lugar, ou qualquer outro caractere, torna a placa inválida.
  2. Verificar se restam 7 caracteres.
  3. Verificar se todos os caracteres são alfanuméricos.
  4. Verificar se a entrada segue um dos padrões válidos:
    • Mercosul: LLLNLNN
    • Pré-Mercosul: LLLNNNN
  5. Se a entrada não seguir nenhum dos padrões, a placa é inválida.

Regex

  • Entrada bruta (a máscara fica entre o terceiro caractere e os quatro últimos): ^\s*[A-Za-z]{3}[\s.\-/]*[0-9A-Za-z]{4}\s*$
  • Apenas caracteres (padrão pré-Mercosul ou Mercosul): ^(?:[A-Z]{3}[0-9]{4}|[A-Z]{3}[0-9][A-Z][0-9]{2})$

Exemplos

  • Válido: ABC1234 (padrão pré-Mercosul)
  • Válido: ABC1D23 (padrão Mercosul)
  • Inválido: AB12345 (não segue nenhum formato válido)
  • Inválido: ABCD123 (quantidade incorreta de letras)
  • Inválido: ABC123 (menos de 7 caracteres)
  • Inválido: ABC12D4 (ordem incorreta dos caracteres)

Fontes oficiais

Veja também RENAVAM

Atualizado em

Nesta página