Regex duvidas

8 respostas
L

como melhorar este codigo , ele funciona porem mtos if else

private Boolean codigoPesquisaInvalido(String numeroString) {
		Pattern pattern = null;
		// P
		if (numeroString.length() == 1) {
			pattern = Pattern.compile("[A-Z]{1,1}");
		} else
		// PF
		if (numeroString.length() == 2) {
			pattern = Pattern.compile("[A-Z]{2,2}");
			// PF/
		} else if (numeroString.length() == 3) {
			pattern = Pattern.compile("[A-Z]{2,2}/");
			// PF/N
		} else if (numeroString.length() == 4) {
			pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{1,1}");
			// PF/NE
		} else if (numeroString.length() == 5) {
			pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{2,2}");
		} else
		// PF/NEG
		if (numeroString.length() == 6) {
			pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{3,3}");
		} else
		// PF/NEG/
		if (numeroString.length() == 7) {
			pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{3,3}/");
			// PF/NEG/0
		} else if (numeroString.length() == 8) {
			pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{3,3}/\\d{1,1}");
			// PF/NEG/00
		} else if (numeroString.length() == 9) {
			pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{3,3}/\\d{2,2}");
			// PF/NEG/000
		} else if (numeroString.length() == 10) {
			pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{3,3}/\\d{3,3}");
		} else

		// PF/NEG/0005
		if (numeroString.length() == 11) {
			pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{3,3}/\\d{4,4}");
		} else
		// PF/NEG/0005-
		if (numeroString.length() == 12) {
			pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{3,3}/\\d{4,4}-");
			// PF/NEG/0005-0
		} else if (numeroString.length() == 13) {
			pattern = Pattern
					.compile("[A-Z]{2,2}/[A-Z]{3,3}/\\d{4,4}-\\d{1,1}");
			// PF/NEG/0005-00
		} else if (numeroString.length() == 14) {
			pattern = Pattern
					.compile("[A-Z]{2,2}/[A-Z]{3,3}/\\d{4,4}-\\d{2,2}");
		} else
		// Numero Completo PF/NEG/0035-001
		if (numeroString.length() == 15) {
			pattern = Pattern
					.compile("[A-Z]{2,2}/[A-Z]{3,3}/\\d{4,4}-\\d{3,3}");
		}
		return pattern != null ? pattern.matcher(
				numeroString).find() : true;
	}

8 Respostas

Rodrigo_Sasaki

Mas o que você quer validar? precisa de todos esses casos mesmo?

L

sim tenho que validar todos os casos o usuario pode informar 1 caractere do numero ou +.

Rodrigo_Sasaki

Bom, então você tem que ter todos os casos mesmo, você quer diminuir o código somente?

Você pode colocar os patterns em um hashmap, ou em um Enum, e escolher o pattern a partir do tamanho.

L

Na verdade queria compilar todos os casos em um só, colocando o size da string e usando algo como || or no patern, pra ficar um pattern só

Rodrigo_Sasaki

Não acho que seja uma boa ideia, você vai diminuir as condições, mas a manutenibilidade vai pro lixo.

Se for pra tirar isso, eu faria de um dos jeitos que sugeri. Mas transformar tudo em um Pattern só, com tantas possibilidades, é um tiro no pé.

Rafael_Guerreiro

Cara, garantir todas essas possibilidades em 1 regex, fica MUITO complexo.

Você pode fazer o que o Rodrigo Sasaki falou… Fica até mais simples, algo como:

List<Pattern> patterns = new CodigoPesquisaPatternBuilder().buildPatterns(); // Isola a construção dos patterns
Pattern pattern = patterns.get(numeroString.length() - 1);
L

agora ficou show, separando a classe para construir os patterns em uma lista revou os if/else, obrigado pelas dicas.

Rafael_Guerreiro

Só uma dica:

Você pode juntar alguns patterns assim:

// pattern = Pattern.compile("[A-Z]{1,1}");
// pattern = Pattern.compile("[A-Z]{2,2}");
pattern = Pattern.compile("[A-Z]{1,2}");

// e outros depois, como
// pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{1,1}");
// pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{2,2}");
// pattern = Pattern.compile("[A-Z]{2,2}/[A-Z]{3,3}");
pattern = Pattern.compile("[A-Z]{2}/[A-Z]{1,3}");
  • EDIT -
    Quando o número for fixo, não precisa colocar o mesmo duas vezes, assim é mais simples:
pattern = Pattern.compile("[A-Z]{2}");
Criado 17 de setembro de 2013
Ultima resposta 18 de set. de 2013
Respostas 8
Participantes 3