Placa de veículo
Placas de identificação veicular, nos padrões Mercosul (LLLNLNN) e pré-Mercosul (LLLNNNN).
Validar
- JavaScript, biblioteca
- Python, biblioteca10 casos falham
- Go, biblioteca5 casos falham
- Ruby, biblioteca9 casos falham
- Rust, biblioteca7 casos falham
- .NET, biblioteca5 casos falham
- Erlang, biblioteca17 casos falham
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.formatrestringe a checagem a um formato:"LLLNNNN"(antigo,ABC1234) ou"LLLNLNN"(Mercosul,ABC1D23), os códigos quelicensePlate.getFormatretorna elicensePlate.generaterecebe. 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^4eratrue). licensePlate.getFormatretornanullexatamente quando esta função retornafalse.- A sequência antiga de motos, já extinta,
LLLNNLN(ABC12D3) é inválida.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
options | IsValidLicensePlateOptions | não |
options.format | LicensePlateFormat | não |
| retorna | boolean |
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' }); // trueFonte: Resolução CONTRAN nº 969/2022, Anexos.
Código: brazilian-utils/javascriptTeste com JavaScript isValidLicensePlate
Casos de teste compartilhados (48) e o resultado em cada biblioteca licensePlate.isValid
Formatar
- JavaScript, biblioteca
- Python, biblioteca17 casos falham
- Go, biblioteca8 casos falham
- Ruby, biblioteca15 casos falham
- Rust, biblioteca17 casos falham
- .NET, biblioteca17 casos falham
- Erlang, biblioteca17 casos falham
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 (
abc1dáABC-1), e um quinto caractere que é letra mantém a forma Mercosul (abc1ddá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âmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | string |
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'Teste com JavaScript formatLicensePlate
Casos de teste compartilhados (28) e o resultado em cada biblioteca licensePlate.format
Interpretar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
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.isValidpara isso. A máscara pode estar em qualquer posição, diferente delicensePlate.isValid. - Um valor que não é string retorna uma string vazia.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | string |
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'Teste com JavaScript parseLicensePlate
Casos de teste compartilhados (11) e o resultado em cada biblioteca licensePlate.parse
Gerar
- JavaScript, biblioteca
- Python, biblioteca4 casos falham
- Go, biblioteca3 casos falham
- Ruby, biblioteca4 casos falham
- Rust, biblioteca2 casos falham
- .NET, biblioteca3 casos falham
- Erlang, biblioteca4 casos falham
Gera uma placa aleatória e válida, sem máscara.
formatéLLLNLNN(Mercosul, o padrão) ouLLLNNNN(formato antigo). Qualquer outro valor usa o padrão.- O quinto caractere de uma placa Mercosul é sorteado de
KaZ.AaJsó é 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.isValidaceita. A 2.3.0 usava uma string desconhecida como veio. - Usa uma fonte aleatória não criptográfica.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
format | GenerateLicensePlateFormat | não |
| retorna | string |
Gera uma placa válida aleatória no formato escolhido.
format(GenerateLicensePlateFormat, um alias deLicensePlateFormat):'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
KaZ:AaJsó 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/javascriptTeste com JavaScript generateLicensePlate
Casos de teste compartilhados (6) e o resultado em cada biblioteca licensePlate.generate
Convert to mercosul
- JavaScript, biblioteca
- Python, biblioteca8 casos falham
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca8 casos falham
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.isValida 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ãoA-BC1234era 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 extintaLLLNNLN, 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âmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | string |
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/javascriptTeste com JavaScript convertLicensePlateToMercosul
Casos de teste compartilhados (20) e o resultado em cada biblioteca licensePlate.convertToMercosul
Get format
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca3 casos falham
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca11 casos falham
Detecta o formato de uma placa: LLLNNNN para o formato antigo, LLLNLNN para Mercosul.
- A placa é lida como
licensePlate.isValida 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ãoA-BC1234davaLLLNNNN. - Retorna
nullquando o valor não tem 7 letras e dígitos em um dos dois formatos, inclusive a sequência extintaLLLNNLN. - Retorna
nullexatamente quandolicensePlate.isValidretornafalse.
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âmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | LicensePlateFormat | null |
Detecta o formato normalizado de uma placa: 'LLLNNNN' para o formato antigo brasileiro, 'LLLNLNN' para o Mercosul.
- Retorna
nullquando o valor, sem os separadores, não tem 7 letras e dígitos em um dos dois formatos. - Exporta o tipo
LicensePlateFormat, quegenerateLicensePlatereexporta comoGenerateLicensePlateFormat.
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)Teste com JavaScript getFormatLicensePlate
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
- A placa tem 7 letras e dígitos na sequência
LLLNLNN.
Padrão pré-Mercosul
- A placa tem 7 letras e dígitos na sequência
LLLNNNN, em dois grupos:- O primeiro grupo tem 3 letras (
AaZ). - O segundo grupo tem 4 dígitos.
- O primeiro grupo tem 3 letras (
Algoritmo
- 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. - Verificar se restam 7 caracteres.
- Verificar se todos os caracteres são alfanuméricos.
- Verificar se a entrada segue um dos padrões válidos:
- Mercosul:
LLLNLNN - Pré-Mercosul:
LLLNNNN
- Mercosul:
- 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
- Resolução CONTRAN nº 969, de 20 de junho de 2022, Anexo I: Especificações do Sistema de Placas de Identificação Veicular (PIV)
- RESOLUÇÃO Nº 780, DE 26 DE JUNHO DE 2019
- RESOLUÇÃO 231 DE 15 DE MARÇO DE 2007
- Resolução CONTRAN nº 969, de 20 de junho de 2022
Veja também RENAVAM
Atualizado em
