GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Regex para validar Chassi de carro

Bom dia galera!

preciso fazer a validação de chassi de carro com as seguintes regras:

Criticar o chassi sempre que:
1 - Possuir o número “0” (ZERO) como 1º dígito.
2 - Possuir espaço no chassi
3 - Se, a partir do 4º dígito, houver uma repetição consecutiva, por mais de seis vezes, do mesmo dígito (alfabético ou numérico). Exemplos: 9BW11111119452687 e 9BWZZZ5268AAAAAAA.
4 - Apresente os caracteres “i”, “I”, “o”, “O”, “q”, “Q”.
5 - Os quatro últimos caracteres devem ser obrigatoriamente numéricos
6 - Se possuir número de dígitos diferente de 17 (alfanuméricos).

Não consegui encontrar em nenhum lugar algo que eu possa fazer em regex mesmo a opção 3 (se é que tem como).

Até agora eu tenho isso ^[1-9a-zA-Z][^iIoOqQ\s!#=$%&¨’"´`^¹²³£¢¬§ºª()*+,-./:;°?@[\]_{|}~àáñçéèíìóòúùäëïöü]{12}[\d]{4}$
Algém saberia me dizer se tem como (e como se faz para) incluir a regra 3 ou uma forma de melhorar o que já tenho?

Agradeço a ajuda.

Eu acho melhor você aplicar a regra 3 na mão mesmo, sem regex.

As expressões regulares existem para você especificar o que quer achar, não o que não quer, por isso que fica tão complicado.

É muito mais fácil fazer um método que verifica na mão a repetição.

/*
Criticar o chassi sempre que:
1 - Possuir o número "0" (ZERO) como 1º dígito.
2 - Possuir espaço no chassi
3 - Se, a partir do 4º dígito, houver uma repetição consecutiva, por mais de seis vezes, do mesmo dígito (alfabético ou numérico). Exemplos: 9BW11111119452687 e 9BWZZZ5268AAAAAAA.
4 - Apresente os caracteres "i", "I", "o", "O", "q", "Q".
5 - Os quatro últimos caracteres devem ser obrigatoriamente numéricos
6 - Se possuir número de dígitos diferente de 17 (alfanuméricos). 
*/
Pattern zeroNoPrimeiroDigito = Pattern.compile ("^0");
Pattern espacoNoChassi = Pattern.compile (" ");
Pattern.repeticaoMaisDe6Vezes = Pattern.compile ("^.{4,}([0-9A-Z])\\1{5,}");
Pattern.caracteresiIoOqQ = Pattern.compile ("[iIoOqQ]");
Pattern.ultimos4Numericos = Pattern.compile ("[0-9]{4}$");

Todos os padrões são para usar find, não matches :slight_smile:

//