Estou precisando de uma ajuda com expressões regulares. Já olhei na documentação a respeito, mas ainda fiquei com dúvidas.
Preciso simplificar expressões dos tipos:
Stringstr1="(a|(b|c))";//para "(a|b|c)"Stringstr2="((b&~c)&a)";// para (b&~c&a)
em que a,b,c são meta variáveis, que podem ser (x|y), por exemplo.
Consegui identificar o padrão usado, por exemplo: [a-zA-Z], ~?, mas tenho que usar o replace para substituir, então acho que dessa forma só se aplica se eu quisesse apenas validar.
Algum de vocês pode explicar como que eu posso fazer isso?
Você pode usar uma outra linguagem, como Scala ou Scheme? Isso parece mais aqueles esquemas de simplificação que se fazem com listas.
A parte mais chata, como de costume, é traduzir a notação infixa "(a | (b | c))" para a de listas (mais ou menos assim, escrevendo em Scheme Lisp:
('|a('|bc))
Uma vez feito isso, é relativamente fácil fazer a simplificação das expressões, já que você pode usar várias regras, como (’| 1 x) ==> x, e assim por diante.
Mas não vejo onde aplicar expressões regulares no seu caso.
E
Elane
thingol,
É porque estou fazendo um programa em java e isso é só um detalhe do código, ia ter que fazer tudo em outra linguagem…
Eu achei que ia dar mais trabalho fazer uma função pra isso, não?
Elane
T
thingol
De qualquer maneira, é possível adaptar um programa Scala em um programa Java.
É que expressões regulares não sabem contar parênteses.
Eu já vi gente usando expressões regulares para efetuar “parsing” de expressões, mas requer um pouco de trabalho porque você acaba tendo de reaplicar recursivamente as expressões regulares, o que é meio tedioso. Ou seja, se você tem a entrada “(a | (b | c))”, você teria de criar uma expressão regular que lhe retornasse o que está dentro dos parênteses mais externos (ou seja, “a | (b | c)”), e então ir procurando recursivamente as subexpressões aplicando novamente a tal expressão regular.
Criar uma AST (Abstract Syntax Tree) que represente sua expressão é relativamente simples - é aquele famoso “lab” onde você tem de pegar algo em notação infixa (a | (b | c)) e converter para notação prefixa (| a (| b c)) ou coisa parecida).