[RESOLVIDO] Expressao Regular

7 respostas
M

Não sei se o erro está na expressão regular ou não, ou falta algo no codigo JAVA

if(visor.getText().matches("([*^/+-]|[(]|[)])[.]([*^/+-]|[(]|[)])"))

quando eu entro com a string:

3+3+.+

ele não entra no if

mas quando ponho:

3+.+ ou +.+

ele entra

alguem pode me dar um help to nisso desde manhã…

PS: visor é um JTextField caso esta informação seja relevante…

7 Respostas

guedes

Olá,

cara, se você não explicar a situação fica muito difícil dar alguma ajuda útil.
Da pra fazer várias expressões que casem com as Strings que você passou ( 3+3+.+, 3+.+, +.+ )

Se você for específico de o que é o dado que está entrando e como ele deve entrar pra poder a regex validar ficaria muito mais fácil.

Bom, mas vamos ver o que você já passou.
A sua expressão regular:

code.[/code]Sinceramente ela está bem confusa pra mim.

O “[(]” você estaria dizendo que quer que seja um “(” ao invéz dele representar um grupo, certo?
Se sim, você poderia escapa-lo com uma barra, o mesmo para o fecha parênteses e o ponto

\( \) \. Explica melhor a situação que a gente consegue resolver isso ai.

Abraços

M

tentei fazer via scape também a expressão regular…

e sim estou utilizando ‘(’ como caracter puro e não como grupo

bom vou tentar explicar melhor…

Estou fazendo uma simples calculadora e estava tratando alguns possiveis erros do usuario como

‘+.+’ ou ‘).(’ ou ‘(.)’ ou …

o codigo fonte do metodo de listener é este:

if(event.getActionCommand().equals("=")){
	
	//retiro a redundancia de parenteses vazios da expressao
	visor.setText(visor.getText().replace("()", ""));

	//se a caixa de texto esta vazia nao faca nada
	if(visor.getText().length() == 0)
		return;
	//comparo se a erro de expressao mal formada com a pontuacao
	//ex: +.+, -.-, ^.*,  
	else if(visor.getText().matches("([*^/+-]|[(]|[)])[.]([*^/+-]|[(]|[)])"))
		JOptionPane.showMessageDialog(null, "Expressao invalida - Caracter de ponto flutuante invalido", "ERROR", JOptionPane.ERROR_MESSAGE);
	//confere localizacao dos parenteses na expressao
	else if(visor.getText().matches("[0-9.][(]"))
		JOptionPane.showMessageDialog(null, "Expressao invalida - Caracter de precendecia invalido", "ERROR", JOptionPane.ERROR_MESSAGE);
	//confere se todos os parenteses abertos foram fechados
	else if(parenteses != 0)
		JOptionPane.showMessageDialog(null, "Expressao nao balanceada", "ERROR", JOptionPane.ERROR_MESSAGE);
	//confere se o ultimo caracter escrito no visor é uma operacao
	else if(visor.getText().charAt(visor.getText().length()-1) == '^' ||
			visor.getText().charAt(visor.getText().length()-1) == '*' ||
			visor.getText().charAt(visor.getText().length()-1) == '/' ||
			visor.getText().charAt(visor.getText().length()-1) == '+' ||
			visor.getText().charAt(visor.getText().length()-1) == '-')
		JOptionPane.showMessageDialog(null, "Expressao incompleta", "ERROR", JOptionPane.ERROR_MESSAGE);
	else
		visor.setText(calculaOperacao(visor.getText()));
}

a expressão provavelmente está correta pois testei ela de varias formas…

provavelmente é algo no codigo JAVA que me falta colocar, ou usar algum outro metodo de outra classe

testei a expressao no diversas vezes no site:
http://tools.lymas.com.br/regexp_br.php

Pois como citei anteriormente é esquisito ele fazer o match “só de vez enaqundo”
3+.+, +.+

e quando coloco uma expressao com
3+3+.+

ele simplesmente ignora o match dos ultimos caracteres

M

PS: trocando para regex com o scape

else if(visor.getText().matches("[*^/+\(\)-][\.][*^/+\(\)-]"))

eu continuo com o mesmo problema

guedes

Certo, agora sim entendi o problema.

Você precisa validar a entrada refente ao cálculo que o usuário quer fazer.

Desenvolvendo o raciocínio.

Vão ter os seguintes caracteres que se forem inseridos em sequência será gerado um cálculo inválido:

+ - * / ^ .Certo?

Temos então uma lista de caracteres onde qualquer um não pode se repetir duas vezes.

Existirão também os parêntesis, mas esses tem um caso específico, por exemplo:

+(é uma entrada válida, mas(+não é.
Mas o “.” (ponto) é inválido tanto antes como depois de um parêntesis, a não ser que você considere que um 2+.5 seja a mesma coisa que um 2+0.5, muitas calculadoras consideram, mas acho que não é o seu caso então o seguinte tembém seria inválido: .( (. .) ). Então teriamos que considerar como inválido um abre parêntesis seguido de qualquer um dos caracteres da lista,
ou, qualquer um dos caracteres seguido de um fecha parêntesis,
ou um ponto vindo antes de qualquer parêntesis,
ou um ponto vindo depois de qualquer parêntesis.

Entendeu meu raciocínio?
Se ver com calma a resposta já está quase dada.
Tenta criar alguma coisa em cima disso e posta o que conseguir.
:wink:

M

Bom o raciocinio eu já tinha pego…

tinha feito até uma tabelinha com o que é ou não possivel

(9   -> Valido
((   -> Valido
(.    -> Valido //eu considero que ele possa colocar (.5 como se fosse (0.5
(+   -> Valido //eu considero que como se fosse caracter de sinal, ou seja (+9 eu acabo transformado em (0+9 que é a mesma coisa
()    -> Valido, mas irrevelante por isso tiro todos fora

99   -> Valido
9(   -> Invalido
9.   -> Valido
9+  -> Valido
9)   -> Valido

.9   -> Valido
.(    -> Invalido
..    -> Invalido
.+   -> Valido //eu considero que 8.+ vira 8.0+
.)    -> Valido//mesmo motivo acima

+9   -> Valido
+(   -> Valido
+.   -> Valido
++  -> Invalido
+)   -> Invalido

)9  -> Invalido
)(   -> Invalido
).   -> Invalido
)+  -> Valido
))   -> Valido

bom de todos os casos invalidos eu tentei resolver da seguinte forma:

++

travei na hora de digitar

9( -> Invalido
.( -> Invalido

queria resolver pela regex:
“[0-9\.][\(]”

)9
)(
).

queria resolver pela regex:
“[\)][0-9\(\.]”

+)

Confesso que tinha esquecido de resolver mas provavelmente seria algo do tipo
“[*^/±][)]”

Alem de todas estas duplas teria as triplas com ponto no meio:

+.)
+.(

(.(
(.+

).)
).+

e são essas que eu tava validando pela expressão:
“[^/+\(\)-][\.][^/+\(\)-]”

Mas por algum motivo que eu não sei qual, depende a cadeia de caracteres informada ele pega o não no match.

Pois ao meu ver nos exmplos que eu dei:
+.+
3+.+
3+3+.+ (Não esta pegando não sei o porque)

todas estas o regex pegaria pela expressao acima
correto?

guedes

Um detalhe que eu não tinha visto antes.
Você está usando o matcher.matches().

O matches() só retorna true se a expressão casar com a String inteira.

Eu sempre uso o find(), ele tenta buscar algum trecho da String que case com a regex, que no seu caso acho que seria o correto,
um caracter errado já quebraria todo o cálculo.

Faz o teste, acho que deve funcionar.
Vou dar uma olhada com calma no seu post anterior e já posto denovo.

M

Poxa cara valeu era exatamente isto.

troquei por:

if(Pattern.compile("[*^/+\(\)-][\.][*^/+\(\)-]").matcher(visor.getText()).find())

e funcionou

muito obrigado pela ajuda

Criado 3 de junho de 2010
Ultima resposta 3 de jun. de 2010
Respostas 7
Participantes 2