Olá, estou desenvolvendo um projeto que precisa fazer a análise validando o conteúdo da String.
Por exemplo:
Quero validar os seguintes caracteres: “AB->” No entanto o simbolo -> deve ser considerado como sendo um caractere apenas, não sendo permitido o uso de “>-” (permutação)
Continuando no mesmo exemplo: Se o usuário inserir: “->AB , A->B” é valido, “A-<B” inválido.
Olhando na API interessei pela MaskFormatter ví uns metodos interessantes (validar caracteres,enfim), mas acredito que ela não consiga resolver o que eu especifiquei acima. Pq o principal problema no meu caso é trabalhar o simbolo “->” sendo um único caractere.
O único caractere inválido na expressão seria <-, é isto?
Abraços.[/quote]
Sim, repare que o principal problema é trabalhar com o simbolo “->” sendo um caractere e não como sendo “-”+">" , sendo assim não é permitido a permutação do próprio.
Bom não sei se entendi muito bem o que você falou, mas penso que você poderia fazer da seguinte maneira:
Pegar o texto desejado com uma máscara que aceite somente esses caracteres, depois onde o texto for igual a ‘->’ transformar em uma varíável do tipo String (exemplo String C), caso seja diferente ‘>-’ cai em uma exception, concatena todas as letras e dps conta qnts ‘As’, ‘Bs’ e ‘Cs’ tem no seu texto.
Bom sei que não parece ser a melhor solução mas é a idéia que tive.
Você também pode tentar usar o indexOf para localizar a sequencia “->”. Caso ela exista aceite, caso não, rejeite.
Ou o inverso.
Para localizar o “>-”.
Mudei o título do tópico. E descobri o que eu preciso é um analisador lexico para java e um parser para fazer esta manipulação, alguem indica algum? (dei uma googlada e não localizei algum com uma documentação)
Exemplo: supondo os seguintes caracteres válidos (“ABCDEFGHIJKLMNOPQRSTUVWXYZ!&|>()”)
aí o usuário vai la e insere = “AB()”, no caso ele colocou valores válidos, mas os parenteses neste software tem como finalidade separarar formulas por exemplo “(AB)”, sendo assim “AB()” é algo inválido.
Outo exemplo: mesmo os simbolos !&|> sendo válidos eles não podem ser usado em sequencias. acarretando em outra Exception. Enfim, tem várias exceções que preciso tratar em relação a PERMUTAÇÃO.
Portanto preciso de uma analise léxica e um parser para resolver isso (acredito eu). Alguem indica um?
eu tenho uma "sugestão", de um algoritmo que acho que funciona, você lendo cada caractere:
monte uma pilha contendo cada caractere em separado;
crie um array com os tokens aceitos;
crie uma string para guardar o "acumulado" entre os caracteres lidos
crie um array de tokens reconhecidos e um de não reconhecidos;
leia e retire o primeiro caractere da pilha, insira-o no acumulado;
com o indexof, verifique se existe algum dos caracteres aceitos no acumulado,
caso sim:
retire-o do acumulado e coloque-o nos tokens aceitos
retire o que vier antes dele e coloque nos não aceitos
o que vier depois dele você deve manter no acumulado para consumir depois
leia e retire o próximo caractere igual você fez no passo 5 com o primeiro e depois volte ao passo 6.
depois de ter consumido o ultimo caractere, caso ainda exista alguma coisa no acumulado, jogue no array de tokens não encontrados.
desta forma eu estou desconsiderando "separadores" de tokens, como um espaço ou um ";" em um analisador lexico de java por exemplo e identificando o token mesmo que ele esteja no meio de uma palavra como por exemplo em abc->def.
se você quiser usar os "separadores", teria que mudar esse algoritmo para só validar o token como a palavra inteira (entre um separador e outro, você precisaria de um array de separadores também), separar tokens entre um separador e outro para depois validar ou invalidar, mas ai é outra história…
[quote=maior_abandonado]eu tenho uma "sugestão", de um algoritmo que acho que funciona, você lendo cada caractere:
monte uma pilha contendo cada caractere em separado;
crie um array com os tokens aceitos;
crie uma string para guardar o "acumulado" entre os caracteres lidos
crie um array de tokens reconhecidos e um de não reconhecidos;
leia e retire o primeiro caractere da pilha, insira-o no acumulado;
com o indexof, verifique se existe algum dos caracteres aceitos no acumulado,
caso sim:
retire-o do acumulado e coloque-o nos tokens aceitos
retire o que vier antes dele e coloque nos não aceitos
o que vier depois dele você deve manter no acumulado para consumir depois
leia e retire o próximo caractere igual você fez no passo 5 com o primeiro e depois volte ao passo 6.
depois de ter consumido o ultimo caractere, caso ainda exista alguma coisa no acumulado, jogue no array de tokens não encontrados.
desta forma eu estou desconsiderando "separadores" de tokens, como um espaço ou um ";" em um analisador lexico de java por exemplo e identificando o token mesmo que ele esteja no meio de uma palavra como por exemplo em abc->def.
se você quiser usar os "separadores", teria que mudar esse algoritmo para só validar o token como a palavra inteira (entre um separador e outro, você precisaria de um array de separadores também), separar tokens entre um separador e outro para depois validar ou invalidar, mas ai é outra história…[/quote]
Orra, muito boa essa idéia, com certeza irá resolver meu problema.
Vou estudar a implementação.
Agradeço ae, vlw!