Expressao Regular

21 respostas
F

Bom dia amigos, preciso resolver um problema mas esta dificil…
tenho que montar uma expressa regular para aceitar letras maisculas, minuscula e 0/9 porem obriga-los pelo menos um desses caracteres exemplo

se eu digitar fernando1 nao passa porem se difitar Fernando1 ou fernandO1 tudo bem é aceitavel, porem nao tenho ideia de como fazer ja
tentei [A-z][a-z][0-9] depois de A-Za-z0-9 mas nao rola

Aguem pode me ajudar…

Abraços

Fernando Oliveira

21 Respostas

G

Tenta isso…

[a-Z0-9]+

O mais significa ao menos 1 caractere de dentro das chaves

G

Pode tentar tbm

[\w\d]+
diego2005

Pelo que entendi, ele quer garantir pelo menos um caractere de cada grupo que ele falou, então acho que seria + - assim:

[a-z]+[A-Z]+[0-9]+

T+

Mantu

gr_marco:
Pode tentar tbm

[\w\d]+


Neste caso, não pode. É que o “\w” inclui o caractere underscore ("_").
Em tempo: “\w” engloba “\d”, tornando a expressão acima equivalente a \w+

G

É vero…
Não li direito o enunciado…
Fernando, vc poderia especificar melhor o que precisa?

Mantu

diego2005:
Pelo que entendi, ele quer garantir pelo menos um caractere de cada grupo que ele falou, então acho que seria + - assim:

[a-z]+[A-Z]+[0-9]+

T+


Também não funciona… A regex acima só aceita Strings em que pelo menos o primeiro caractere seja de “a” até “z”, termine com pelo menos um caratere entre “0” e “9”, e no meio tenha pelo menos um caractere de “A” até “Z”.
Infelizmente, creio que a solução buscada pelo OP não possa se dar através de regex. O mais próximo que consegui chegar foi:

[a-zA-Z0-9]*[A-Z]+[a-zA-Z0-9]*[a-z]+[a-zA-Z0-9]*[0-9]+[a-zA-Z0-9]*

E mesmo assim, ela não funciona legal, pois só aceita Strings que tenham pelo menos 1 letra maiúscula, uma minúscula e um número nesta ordem.
Talvez se você fizer uma combinação de regex como acima, alternando a ordem dos trechos significativos ("[A-Z]+", “[a-z]+” e “[0-9]+”) e intercalando-as com um “|”, pode até dar certo, mas que vai ficar super feio, não tenha dúvidas… Talvez seja melhor procurar uma outra alternativa para solucionar este problema…

Mantu

Algo assim talvez funcione:

String regex = "[a-zA-Z0-9]*[A-Z]+[a-zA-Z0-9]*[a-z]+[a-zA-Z0-9]*[0-9]+[a-zA-Z0-9]*" + "[a-zA-Z0-9]*[A-Z]+[a-zA-Z0-9]*[0-9]+[a-zA-Z0-9]*[a-z]+[a-zA-Z0-9]*" + "[a-zA-Z0-9]*[a-z]+[a-zA-Z0-9]*[A-Z]+[a-zA-Z0-9]*[0-9]+[a-zA-Z0-9]*" + "[a-zA-Z0-9]*[a-z]+[a-zA-Z0-9]*[0-9]+[a-zA-Z0-9]*[A-Z]+[a-zA-Z0-9]*" + "[a-zA-Z0-9]*[0-9]+[a-zA-Z0-9]*[a-z]+[a-zA-Z0-9]*[A-Z]+[a-zA-Z0-9]*" + "[a-zA-Z0-9]*[0-9]+[a-zA-Z0-9]*[A-Z]+[a-zA-Z0-9]*[a-z]+[a-zA-Z0-9]*" ;
Mas… Convenhamos… Tréxi demais…

diego2005

Ou então ele faz uma expressão pra cada restrição, e se as três expressões obtiveram sucesso, quer dizer que texto está no formato que ele quer.

Mas convenhamos também, acho que não ficaria legal, rsrsrsrs…

T+

Mantu

diego2005:
Ou então ele faz uma expressão pra cada restrição, e se as três expressões obtiveram sucesso, quer dizer que texto está no formato que ele quer.

Mas convenhamos também, acho que não ficaria legal, rsrsrsrs…

T+


Ah, mas fica muito melhor que o monstrinho que eu coloquei lá em cima… :lol:

boolean isValid(String texto){
	String 
		regexMinuscula = "[\w&&[^_]]*[a-z]+[\w&&[^_]]*",
		regexMaiuscula = "[\w&&[^_]]*[A-Z]+[\w&&[^_]]*",
		regexDigito = "[\w&&[^_]]*[0-9]+[\w&&[^_]]*"
	;
	return
		texto.matches(regexMaiuscula) &&
		texto.matches(regexMinuscula) &&
		texto.matches(regexDigito)
	;
}

Aff…

peczenyj

por que nao fazer 3 expressões regulares simples ?

se casar com [A-Z]
E casar com [a-z]
E casar com [0-9]

então ta certo.

melhor do que fazer expressões complexas que podem demorar demais para seres verificadas.

diego2005

peczenyj:
por que nao fazer 3 expressões regulares simples ?

se casar com [A-Z]
E casar com [a-z]
E casar com [0-9]

então ta certo.

melhor do que fazer expressões complexas que podem demorar demais para seres verificadas.

Então acho que seria:

se casar com [A-Z]+
E casar com [a-z]+
E casar com [0-9]+

Por que tem que ter pelo menos um caractere de cada grupo…

T+

F

galera seguinte estava ate pensando em fazer assim mesmo existe A-Z && a-z && 0-9

porem como é feito isso, pois se uso A-Z ele quer q tudo fiquei Maisculo e assim para todos correto??

abçs

diego2005

Por isso deve-se colocar o +, que significa uma ou mais vezes…

T+

Mantu

Do jeito que eu implementei a idéia do diego2005 no meu último post não deu certo? Alguém testou?

F

entendi mas assim se eu faço isso me retorna false tem ideia ?

exemplo
[A-Z]+[a-z]+[0-9]

mesmo assim nao funciona
minha string esta como Fernando!28

Pattern.compile("[A-Z]+[a-z]+[0-9]+").matcher(“Fernando!28”).matches()

Abraços
Fernando

diego2005

É o que o Mantu falou anteriormente, essa expressão junta não vai funcionar, você tem que separá-la em 3.

T+

Mantu

diego2005:
É o que o Mantu falou anteriormente, essa expressão junta não vai funcionar, você tem que separá-la em 3.

T+


Mas não é só pegar a expressão [A-Z]+[a-z]+[0-9] e separar em 3…
Se simplesmente fazer uma regex [A-Z]+, uma [a-z]+ e outra [0-9]+, não vai funcionar como estão esperando, uma vez que estas três expressões são exclusivas entre si.
Se a intenção do foliveira81 é só aceitar Strings atendam simultaneamente às restrições:
[list]ter apenas letras ou números[/list]
[list]ter pelo menos 1 letra maiúscula[/list]
[list]ter pelo menos 1 letra minúscula[/list]
[list]ter pelo menos 1 dígito[/list]

Creio que as regex ficariam como escrevi há pouco neste tópico

Guto_Magalhaes

Tem um programa muito util chamado kodos. Ele serve para testes de expressões regulares.

Segue tb um material basico

http://guia-er.sourceforge.net/

T

Usar uma única expressão regular ficou muito complicado. Melhor usar três, como o Mantu indicou.

import java.util.regex.*;

class TestePadrao {
	public static void main(String[] args) {
// Não recomendaria usar um padrão só, mas os três do Mantu,
// que são mais fáceis de manter.
                Pattern pat = Pattern.compile (
".*"
+ "("
+ "[A-Z]+[^A-Za-z0-9]*[a-z]+[^A-Za-z0-9]*[0-9]+" 
+ "|" 
+ "[a-z]+[^A-Za-z0-9]*[A-Z]+[^A-Za-z0-9]*[0-9]+"
+ "|" 
+ "[0-9]+[^A-Za-z0-9]*[a-z]+[^A-Za-z0-9]*[A-Z]+"
+ "|" 
+ "[a-z]+[^A-Za-z0-9]*[0-9]+[^A-Za-z0-9]*[A-Z]+"
+ "|" 
+ "[0-9]+[^A-Za-z0-9]*[A-Z]+[^A-Za-z0-9]*[a-z]+"
+ "|"
+ "[A-Z]+[^A-Za-z0-9]*[0-9]+[^A-Za-z0-9]*[a-z]+"
+ ")"
+ ".*");

                String [] fileStr = {
                    "Marcelo23", // bate
                    "23Marcelo", // bate
                    "jaj@asdas33", // não bate
                    "josé da silva", // não bate
                    "12 tiradentes 23", // não bate
                    "12 Tiradentes 23", // bate
                };
                
		for (int i = 0; i &lt fileStr.length; ++i) {
		    if (pat.matcher (fileStr[i]).matches()) {
			System.out.println (fileStr[i]);
		    }
		}
	}
}
T

Um pouco mais simples:

import java.util.regex.*;

class TestePadrao {
	public static void main(String[] args) {
// Não recomendaria usar um padrão só, mas os três do Mantu,
// que são mais fáceis de manter.
                Pattern pat = Pattern.compile (
// 
".*"
+ "("
+ "[A-Z]+.*[a-z]+.*[0-9]+" 
+ "|" 
+ "[a-z]+.*[A-Z]+.*[0-9]+"
+ "|" 
+ "[0-9]+.*[a-z]+.*[A-Z]+"
+ "|" 
+ "[a-z]+.*[0-9]+.*[A-Z]+"
+ "|" 
+ "[0-9]+.*[A-Z]+.*[a-z]+"
+ "|"
+ "[A-Z]+.*[0-9]+.*[a-z]+"
+ ")"
+ ".*");

                String [] fileStr = {
                    "Marcelo23", // bate
                    "23Marcelo", // bate
                    "jaj@asdas33", // não bate
                    "josé da silva", // não bate
                    "12 tiradentes 23", // não bate
                    "12 Tiradentes 23", // bate
                };
                
		for (int i = 0; i &lt fileStr.length; ++i) {
		    if (pat.matcher (fileStr[i]).matches()) {
			System.out.println (fileStr[i]);
		    }
		}
	}
}
F

Valeu Galera pela força ajudou muito, vou testar que nosso amigo thingol passou…
e depois disso estudar mais sobre expressao regular heheheh pq sou bem fraquinho nisso pois nunca tinha dado valor hehehe… agora sei o quanto é tao poderoso mesmo tendo algumas particularidades.

Att.

Criado 16 de julho de 2007
Ultima resposta 17 de jul. de 2007
Respostas 21
Participantes 7