Problema com expresssão regular

17 respostas
pauloperes

Olá a todos,

Tenho uma aplicação que se conecta via telnet em um equipamento e envia alguns comandos, o mesmo responde no formato xml, porém a minha string vem da seguinte forma:

mode display xml
pwd
mode display xml

<?xml version="1.0" encoding="UTF-8" ?>
<response>
<operation name="pwd" path="/">
  <execution status="success" />
  <address>/</address>
</operation>
</response

Preciso pegar tudo que está entre <?xml e a tag porém não estou conseguindo, alguém sabe qual expressão devo usar neste caso?

Att,

Paulo

17 Respostas

ctdaa

Olá Pauloperes. Coloque o código que você já fez pra gente analisar, mas o problema deve ser com o caracter “<”. Para montar a expressão regular coloque um “” barra invertida antes do caracter especial.

zoren

com substring não funciona?

pauloperes

Veja minha expressão: “.\<?xml(.)\”

pauloperes

ctdaa

fiz e não funcionou.

ctdaa

A interrogação também é caracter especial…
Tente assim: “\<\?xml(.*)\<\/response\>”

pauloperes

Não funcionou também

ctdaa

Conte mais sobre a lógica do seu programa. Como você está lendo a cadeia de entrada? é um arquivo? está usando readLine?
Se você está tratando uma linha por vez a expressão não vai funcionar mesmo, porque ela está esperando tudo junto. neste caso você vai precisar de dois “matches” um para o início e um para o final, ligar umas flags e ir capturando as linhas após a flag de início estar ligada.

pauloperes

Veja,

No meu método eu recebo uma string, se eu der um print nela aparece todo o conteudo.

[code]
mode display xml
pwd
mode display xml





/


[/code/

ctdaa

Acho que não, mas não custa perguntar… é a segunda vez que você cola o texto do mesmo jeito: tá faltando “>” após o </response… na última linha?

ctdaa

Tente assim, considerando quebras de linha:
“\<\?xml((.|\n)*)\<\/response\>”

pauloperes

Kra,

Show de bola, funcionou, valeu mesmo…

abraço

ctdaa

Disponha, só para completar o tópico, se você está usando Pattern as duas linhas abaixo são equivalentes:

Pattern pat = Pattern.compile("\\<\\?xml(.*)\\<\\/response\\>", Pattern.DOTALL);
// ou
        Pattern pat = Pattern.compile("\\<\\?xml((.|\n)*)\\<\\/response\\>");

DOTALL faz a expressão “.” incluir quebra de linhas.

pauloperes

Kra agora to com outro problema.

Veja estou efetuando um outro comando onde a string retornada tem mais de 400 linas, quando chega expressão regular gera uma execção: “java.lang.StackOverflowError”, sei que está ocorrendo um estouro da pilha, isto acontece porque a string é muito grande?

Existe alguma forma de corrigir isto?

att,

Paulo

pauloperes

Kra,

Chega ser até piada, mas veja o que eu fiz e funcionou, alterei a expressão regular para:

Pattern pat = Pattern.compile("\\<\\?xml(.*)\\<\\/response\\>", Pattern.DOTALL);
ctdaa

Mais uma para anotar no caderninho! Valeu.

P

Cara pra não ter que criar um novo tópico vou perguntar aqui mesmo já que se trata do mesmo assunto, seguinte pessoal eu preciso fazer uma validação através de expressão regular, mas no meu caso eu preciso validar uma expressão matemática, tipo : cos(x)+sin(x), expressões no caso com funções matemáticas, alguém tem alguma idéia de como posso fazer isso através de expressão regular ?

ctdaa

phillip, com certeza dá para fazer, você está no caminho certo. Existem até alguns analisadores sintáticos de linguagens que são baseados em expressões regulares + bnf . Para tratar somente fórmulas matemáticas (se for algo específico, não o livro de algebra completo!) você conseguirá resolver com expressões regulares. Para algo mais complexo sugiro um gerador de parser do tipo JavaCC (https://javacc.dev.java.net/) que tem plugin para eclipse e netbeans.
Pesquisa um pouco sobre o assunto e se tiver problemas vai colocando no forum que o pessoal do GUJ te ajuda.

Criado 27 de agosto de 2009
Ultima resposta 28 de ago. de 2009
Respostas 17
Participantes 4