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