Jump to content


Photo

Expressão Regular


  • Faça o login para participar
13 replies to this topic

#1 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 10/10/2006, 12:22

Olá pessoal, estou fazendo uma Calculadora Polonesa Reversa e a primeira verificação que eu faria seria no formato da expressão que estaria entrando.
Entraria a expressão toda e em cima dela eu faria a primeira verificação usando ER.

O Formato deve ser assim:
número número operador número operador número operador...
Sempre separados por um espaço podendo haver algo do tipo:
10 2 / 4 * - +
10/2 4 * 3 +
5/2 8/4 + 9/3 *
A partir da segunda já é sequencia e deve terminar com operador, no caso os 4 principais: adição, subtração, divisão e multiplicação.

Certo, ai eu fiz essa expressão:
^(([0-9]{1,})(\\/[1-9]{1,})?[[:space:]]){2}[\\+\\-\\*\\/]([[:space:]](.+?)[\\+\\-\\*\\/])?$

Essa expressão no caso só verifica a existencia de números ou frações nas duas primeiras casas, operador na terceira, alguma coisa pondendo ou não existir e deve terminar com operador.

Funciona legal, mas o problema é que se a partir da 3 casa eu colocar varios espaços ele está considerando, por exemplo:
10/2 1/2 /				  2 +
Isso não deveria acontecer...

Alguém tem uma solução ou ficou muito confuso?

Flws...
:DAté mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#2 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 10/10/2006, 13:02

Num li tudo, depois do almoço é **** ... mas não é só limitar a 1 único espaço ??

([ ]{1})

PS.: Nussa, isso tá certo ?? Faz mile anos que não vejo uma ER e to sem um debugger aqui tbm ...
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#3 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 10/10/2006, 13:12

Tá certo sim, é o que eu quero, só preciso ajustar esse detalhe que é verificar a quantidade de espaços em branco.
Coloquei dessa maneira que você falou mas deu na mesma, se tiver dois espaços ele está continuando..

Estranho que entre a primeira e segunda casa acontece o esperado caso haja mais de um espaço entre elas...

Flws...
:( Até mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#4 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 10/10/2006, 16:05

Que calculadora estranha!
Não a entendo, então não tenho como fazer algo.

Enfim, [[:space:]] não envolve somente espaço, mas sim [ \t\n\r\f\v].

E pelo visto o problema está em .+? que está casando tudo depois de um espaçamento até a ocorrência de um operador aritmético.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#5 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 10/10/2006, 16:18

Funciona assim Eclesiastes, como aquelas HP's por ai.
Você digita um número e pressiona enter, digita outro e pressiona enter.. vai ficando assim na tela:

10
5

Ai quando você preciona um operador, adicção por exemplo, ele calcula esses dois números. Ai você digita outro número e aperta enter e depois tem que vir um operador.. Daí pra frente é sequencia, numero operador (vem resultado), número operador (vem resultado).. Por exemplo:

10
5
/
(resultado = 2)
6
*
(resultado = 12)


Tentei achar um exemplo tipo de um simulador aqui mas não achei.

Obrigado,
:)Até mais

Edição feita por: Frenesi, 10/10/2006, 16:18.

Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#6 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 10/10/2006, 17:38

Pensei em:
/^
	(\d+
		(?:\/\d+)*
	)
	(?=(?s).*?
		([\r\n]{1,2})([\/\*\+-])
	)
	(?:(?2)
		(?:(?3)|
		   (?1)
		)
	)+
$/x

O que acha?
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#7 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 10/10/2006, 18:33

Mas não deu, veja a expressão que eu entrei:
10/2 5 / 4 * 7 / 8 * 1 - 7 * 5 + 2 * 3 / 6 -
Eu fiz da seguinte maneira e consegui, pelo menos das várias formas que eu tentei deu certo: Veja:
/^(([0-9]+?)(\\/[1-9]+?)?[ ]){2}[+\-\*\/]
([ ]([0-9]+?)(\\/[1-9]+?)?([ ][+\-\*\/]))+?$

Meio bagunçado.. :P Deu pra entender? Tem ago de errado?

Valeu! :)

Flws...
(y)Até mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#8 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 10/10/2006, 19:43

Funcionou sim, é que eu fiz para trabalhar com enter (como você tinha dito), não com espaço.

Quanto a algo errado, cito:

[ ]
Lista com 1 elemento? Não é lista.

([0-9]+?)(\\/[1-9]+?)?
Não faz sentido tentar tirar o efeito guloso de um caractere ou grupo se o que vem após não o satisfaz.

([ ][+\-\*\/]))+?$
Não faz sentido, tem que casar até o fim, ou seja, ser guloso.

Edição feita por: Eclesiastes, 10/10/2006, 22:33.

Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#9 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 11/10/2006, 08:08

Mas se eu tirar os '+?' dá errado..
Acho que dei o exemplo errado, eu estava me referindo à calculadora propriamente dita, não da maneira que estou tentando fazer...
Aqui eu iria trocar o 'enter' que damos na calculadora por um espaço..

Tem como mostrar isso na sua ER então? :)

Obrigado..
^_^ Até mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#10 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 11/10/2006, 11:44

Ah! Agora eu acho que entendi como funciona! :S (Sou lentium! :D)

Esquece aquela maluquice que fiz. :P

Quanto ao +?, é só tirar o ?.

Pois bem, de forma bem enxuta e compatível com Perl:
/^(\d+(?:\/\d+)? ){2}([\/\*\+-])(?: (?1)(?2))*$/

Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#11 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 18/10/2006, 09:11

Voltando um pouco a este assunto, o que significa este trecho Eclesiastes?
(?1)(?2)
O Eclipse não está aceitando estes números na expressão regular não. Existe alguma outra forma de representar?

Flws...
(ok2)Até mais

Edição feita por: Frenesi, 18/10/2006, 09:12.

Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#12 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 18/10/2006, 12:59

É como se fosse um retrovisor, só que é um retrovisor para a expressão do grupo, e não para o que casou.

Por exemplo:
([[:alpha:]_]+)\d(?1)

É o mesmo que:
([[:alpha:]]_]+)\d[[:alpha:]_]+

É um excelente recurso! =)
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#13 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 18/10/2006, 16:01

Entendi, é bom mesmo mas o Eclipse "chiou" com este recurso, pelo menos na versão 3.1. :ponder:

Mas dessa outra maneira foi na boa, obrigado. (ok2)

Flws...
:)Até mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#14 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 24/10/2006, 12:42

Eclesiastes, infelizmente não consegui usar a expressão regular, depois deu uns erros e desisti e fiz de outra forma.

Coloquei no Banco de Scripts em Java/JSP: http://forum.wmonlin...howtopic=163305

Se tu quiser dar uma olhada depois.

Flws...
:DAté mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq