Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

mapb_1990

validação com regex

Recommended Posts

mapb_1990

preciso de validar o input do utilizador. ele tem k ser uma função do tipo ax^3+bx^2+cx+d

regex = "((\\-|\\+)?(\\d+|\\d+[\u002E|\u002C]\\d+)?x\\^3)?" +

"((\\-|\\+)(\\d+|\\d+[\u002E|\u002C]\\d+)?x\\^2)?" +

"((\\-|\\+)(\\d+|\\d+[\u002E|\u002C]\\d+)?x)?" +

"((\\-|\\+)(\\d+|\\d+[\u002E|\u002C]\\d+)?)?";

fiz este regex, mas tem um problema. kuando nao insiro a 1ª parte da função (ax^3), obrigatóriamente tenho que inserir o sinal nas outras.

por exemplo: se inserir 2x^2+4x+65 nao passa, mas se for +2x^2+4x+65, já da.

ora, eu queria que aceita-se com ou sem sinal, caso seja o primeio polinomio.


Serviços de WebDesignwww.miguelborges.com

Share this post


Link to post
Share on other sites
mapb_1990

Talvez te ajude se prefixares com "^[-+]?"

Isto fá-lo aceitar um sinal, opcionalmente, mas só no inicio da string.

como? assim?

                regex = "^[-+]?((\\d+|\\d+[\u002E|\u002C]\\d+)?x\\^3)?" +
                        "((\\-|\\+)(\\d+|\\d+[\u002E|\u002C]\\d+)?x\\^2)?" +
                        "((\\-|\\+)(\\d+|\\d+[\u002E|\u002C]\\d+)?x)?" +
                        "((\\-|\\+)(\\d+|\\d+[\u002E|\u002C]\\d+)?)?";

é k assim, tenho o mesmo problema


Serviços de WebDesignwww.miguelborges.com

Share this post


Link to post
Share on other sites
Njay

Hummm... pois, li o teu problema na diagonal e dei só uma dica que podia ajudar, mas realmente não resolve. Não tou a ver nenhuma forma simples de fazer isso com uma expressão regular (sem ter um porradão enorme de |). Eu no teu lugar se calhar implementava um algoritmo, não baseado apenas em expressões regulares, até porque seria bastante mais flexível e com facilidade poderia aumentar para graus maiores. A tua expressão regular é muito rígida, não permite trocar a ordem a termos, nem ter termos em várias partes (como "3x - 2 + 4x"). Eu começava por remover todos os espaços da expressão, depois adicionava 1 espaço antes de cada sinal e a seguir partia por espaços. Aí fazia um loop a cada termo para o parsar e acumular numa estrutura de dados apropriada e/ou verificar a sua validade com uma expressão regular já bastante mais simples.

Ou então... garantes que a expressão começa sempre com um sinal, e fazes a expressão regular verificar isso. Basta adicionares o sinal ao inicio da expressão caso esta não o tenha. Por exemplo: o utilizador introduz "3x + 1"; tu vês que não começa com + ou - e portanto prefixas com +, ficando "+3x + 1". Aí já facilmente consegues uma expressão regular para parsar a expressão.


Blog: Tróniquices ~ Projecto: EmbeddedDreams.com

Share this post


Link to post
Share on other sites
Knitter

Tenta uma abordagem mais simples, embora julgue que se possa simplificar essa expressão regular, mas podes simplesmente separar o input dado através dos sinais de mais ou de menos. Depois validas os elementos resultantes.

Por exemplo, podes usar o método split das strings para dividir pelos sinais ou usar o StringTokenizer se pretenderes algo mais elaborado, embora o split deva ser suficiente.

Share this post


Link to post
Share on other sites
mapb_1990

resolvi fazer com o Njay disse.

testo se a expressao tem ssinal no inicio, se nao tiver ponho-a.

eu ate queria fazer o k o njay disse em 1º lugar, mas ja n tenho tempo. :D

obrigada aos 2


Serviços de WebDesignwww.miguelborges.com

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.