Duvida expressão regular

12 respostas
M

Boa tarde

Eu tenho aqui a seguinte expressão regular:

Pattern p; 
		Matcher m;
		p = Pattern.compile("[^a-zA-Z].*[^#].*[^_].*[^+].*[^-].*[^*].*[^/].*[^%].*[^(].*[^)].*[^0-9].*[^,]"); //expressão para não aceitar nenhum dos caracteres que não for permitido
		m = p.matcher(expressao);		 
		if(m.matches()){
			System.out.println("if 1");
			throw new Exception("Deu erro");
		}

Quando eu passo esse valor para ela “#MA_Opvt-qp” ele passa normal e não cai no meu if…

Agora se eu passo esse valor “#MA_Opvt-qpq” que seria o mesmo de cima só com 3 letras depois do - ja entra no meu if,

Alguem saberia me dizer o que poderia ser???

12 Respostas

E

Tio, eu sou péssimo para ler expressões regulares. Eu prefiro criá-las, de acordo com uma especificação que você me der.

Você poderia dizer o que você quer reconhecer? É que a expressão parece estar muito, muito complicada e você deve estar com algum problema que não estou enxergando.

kdoigor

quando vc usa [^] ele vai negar seu termo.
retira e testa dinovo.

M

Opa,

Cara eu preciso de uma expressao que quando o cliente digitar algum caractere que não for expecifico ele entra no meu if e da a excessão
os caracteres que eu quero que o cliente digite são esses:
a-zA-Z,

_
+

/
%
(
)
0-9
,

Qualquer outro que não seja esses é para entrar no meu if

Rodrigo_Sasaki

muito cuidado ao usar o .* em regex… pois os quantificadores gulosos podem acabar te atrapalhando… por exemplo:

se tiver a String blablabla e digamos que você quer uma regex que case com qualquer tag html de abertura. aí faz a seguinte regex:

<.*>

Aí ao tentar ver com o que a regex casou, o que é retornado?

blablabla

Por que? por que o .* casou com todos os caracteres até o último > da tag de fechamento .

Ele não vai parar quando encontrar o primeiro, e sim quando encontrar o último caractere que ele consiga casar.

Se quiser que ele pare quando encontrar o primeiro, use quantificadores não-gulosos (ainda bem que Java dá suporte a isso, rs).

ao invés da regex <.*> que tem um quantificador guloso use a regex <.*?> que tem um quantificador não-guloso.

não sei se isso resolve seu problema, mas é algo que é importante você saber.

Abraço!

kdoigor
[^a-zA-Z0-9#_+-/%(),]

é isso que vc quer ?

E

Ah, então é babinha. Você disse que os únicos caracteres aceitáveis são:

a-zA-Z#_±/%()0-9,

A única coisa que você precisa é uma expressão regular parecida com a que você já deve ter visto:

“[A-Za-z0-9]+”

que você já deve ter visto em vários lugares (acho que você sabe como funciona, se não souber, veja o famoso site do Aurelio Jargas, http://aurelio.net/regex/ ).

Mas agora tem um impedimentozinho.

Você precisa também aceitar o “-”, certo?

Nesse caso, há um segredinho quando se usa o “[]”. Para que o “-” seja aceito e que ele funcione como um “-”, não como uma coisa que indica um intervalo, esse “-” deve ser o último caracter na lista de caracteres aceitos. Então deveríamos ter algo como:

“[a-zA-Z#_+/%()0-9,-]+”

(Veja que ele ficou imediatamente antes do ] que fecha).

E

Em expressões regulares, a regra é: pensar sempre POSITIVAMENTE (pense na expressão regular que bate com as coisas VÁLIDAS, não as INVÁLIDAS). Ou seja, se você quer que entre no IF, você tem de escrever algo como:

Matcher m;  
p = Pattern.compile("[a-zA-Z#_+/%()0-9,-]+"); // apenas estas coisas são válidas
m = p.matcher(expressao);          
if( !  m.matches()){  
    // ou seja, a expressão regular que bate com as coisas válidas não bateu. 
    System.out.println("if 1");  
    throw new Exception("Deu erro");  
}
M

entanglement:
Ah, então é babinha. Você disse que os únicos caracteres aceitáveis são:

a-zA-Z#_±/%()0-9,

A única coisa que você precisa é uma expressão regular parecida com a que você já deve ter visto:

“[A-Za-z0-9]+”

que você já deve ter visto em vários lugares (acho que você sabe como funciona, se não souber, veja o famoso site do Aurelio Jargas, http://aurelio.net/regex/ ).

Mas agora tem um impedimentozinho.

Você precisa também aceitar o “-”, certo?

Nesse caso, há um segredinho quando se usa o “[]”. Para que o “-” seja aceito e que ele funcione como um “-”, não como uma coisa que indica um intervalo, esse “-” deve ser o último caracter na lista de caracteres aceitos. Então deveríamos ter algo como:

“[a-zA-Z#_+/%()0-9,-]+”

(Veja que ele ficou imediatamente antes do ] que fecha).

Cara essa expressão que vc passou funcionou certinho,

Outra duvida qual é a diferença de eu usar m.matches() de m.find()?

E

matches pega a string inteirinha e ela tem de bater com a expressão regular.
Por exemplo, se a expressão regular é [0-9]+ (ou seja, 1 ou mais dígitos) e você passar a string (“10 reais”), matches vai retornar false, porque “10 reais” tem, fora dígitos, letras também.

find só procura, dentro da string, alguma substring que bata com a expressão regular. Nesse ponto ela parece com o comando de find que existe no seu editor de texto. Nesse mesmo caso ("[0-9]+" e “10 reais”), find retorna true, porque achou a substring “10” dentro de “10 reais”. )

kdoigor

magni:

Cara essa expressão que vc passou funcionou certinho,

Outra duvida qual é a diferença de eu usar m.matches() de m.find()?

sem querer ofender, mas vc viu a doc da classe Matcher ?

M

kdoigor:
magni:

Cara essa expressão que vc passou funcionou certinho,

Outra duvida qual é a diferença de eu usar m.matches() de m.find()?

sem querer ofender, mas vc viu a doc da classe Matcher ?

Cheguei a ler sim, só que não consegui entender direito…
Sempre antes de postar no guj eu procuro primeiro,

E

De fato, o Javadoc é meio difícil de entender mesmo, porque ele foi escrito pelo programador, não por um escritor profissiional (como é o caso da documentação da Microsoft).
Então muitas vezes ele tenta ser muito exato (experimente ler o javadoc das classes de criptografia) mas não é muito claro.
Uma coisa que falta no Javadoc são exemplos (se bem que há alguns exemplos nesse pacote java.util.regex).

Criado 10 de agosto de 2012
Ultima resposta 10 de ago. de 2012
Respostas 12
Participantes 4