Regex

10 respostas
felixcomputer

Pessoal eu estou precisando pegar umas informações através de expressões regulares, que estão em varias linhas, no caso possuem caractere de quebra de linha “\n”, mas se eu tentar usar < tr >(.)< /tr >, que é o conteudo que esta limitado entre essas duas chaves, ele vai dar erro, pensei em usar ((.?)\w*)* que permitiria o caractere, mas mesmo assim naum teria o conteudo das informações em um matching group, alguem pode me ajudar? Obrigado

10 Respostas

Mantu

Sua pergunta está meio confusa, não estou entendendo bem o que vc quer capturar…
O que exatamente vc quer capturar? Todo e quealquer texto que esteja entre tags tr?

felixcomputer

Isso mesmo, quero pegar tudo o que esta entre essas duas tags, ela se extende por varias linhas
< tr >
bla bla bla

adsfadsfdsaf

</ tr >

T

Uma dica que eu dou é que, para efetuar o parse de HTML, é melhor usar um HTML parser.
É que em HTML existem várias coisas que são complicadas de serem tratadas com expressões regulares.
Além disso, existem vários HTML “mal-formados” que iriam fazer sua expressão regular ir “pro lixo”.

Digamos que você tenha algo como:

<div><div></div></div>

que é um DIV dentro de outro DIV. Como é que você faria uma expressão regular que pega só o

mais interno, ou então a que pega os dois níveis de
? É bastante complicado.
Mantu

Olha só, essa regex aqui:

String regex = "<tr>(.|\n|\r|\\x0B)*?</tr>" casou com todo elemento <tr>blablabla...</tr>, mesmo pulando linha  dentro.
Veja se funciona aí, e qq dúvida, pergunte, ok?
Mantu

Verdade o que o thingol falou viu! Se tiver coisa aninhada ou mal formada, vc vai estar com problemas sérios…

felixcomputer

Thingol, muito obrigado pela dica, assim que eu tiver um tempo, eu procuro para estudar. Acredito que vá ser muito útil, contudo, eu estou extendendo um projeto open-source e extraindo umas 40 paginas em HTML, e quando eu peguei esse projeto para estudar, ele ja utilizava expressões regulares para tratar HTML, é com base no site de repositorios source forge, por isso preciso continuar, estou quase acabando, preciso só dessa expressão que eu empaquei! Mas valeu

Mantu, eu testei a tua expressão e ela está pegando apenas o ultimo caracter da minha String, tipo:

String teste = ("<tr>samuel\nMantu</tr>");

Ele me retorna apenas o ultimo caractere, no caso ‘u’;

String teste = ("<tr>samuel</tr>");

Me retorna ‘l’.
Vou dar uma estudada, ainda naum sei o que ta causando isso,

Obrigado

felixcomputer

Descobri Mantu

Era um parentese. Uaauuahuahu
Lembro daquela vez q a regex que a gente usou tava dando erro por causa de um parentese. Muito obrigado meu amigo. Deus te abençoe,

Samuel :thumbup:

Fica assim:

Pattern p = Pattern.compile("

((.|\n|\r|\x0B)*?)");
T

Então vamos lá.

import java.util.regex.*;

class TesteRegex {
    public static void main(String[] args) {
        String str = "&lt;tr&gt;Uma tabela\ncujos elementos\r\nestendem-se por <b>várias</b>linhas&lt;/TR&gt;";
        // ?s = DOTALL, ?i = Ignore Case
        Pattern pat = Pattern.compile ("(?si)&lt;tr&gt;(.*)&lt;/tr&gt;");
        Matcher mat = pat.matcher(str);
        if (mat.find()) {
            System.out.println (mat.group());
        }
    }
}
felixcomputer

Olha eu testei como vc botou e saiu isso:

samuel@samuel:~$ javac TesteRegex.java
samuel@samuel:~$ java TesteRegex
<tr>Uma tabela
cujos elementos
estendem-se por <b>várias</b>linhas</TR>

Depois modifiquei apenas essa linha:

System.out.println (mat.group(1));

e saiu isto:

samuel@samuel:~$ javac TesteRegex.java
samuel@samuel:~$ java TesteRegex
Uma tabela
cujos elementos
estendem-se por <b>várias</b>linhas

Depois fiz isto

System.out.println (mat.group(1).replaceAll("<b>","").replaceAll("</b>," "));

E saiu enfim:

samuel@samuel:~$ javac TesteRegex.java
samuel@samuel:~$ java TesteRegex
Uma tabela
cujos elementos
estendem-se por várias linhas

Claro que com esse replace All naum deixei em negrito, só retirei a tag. Mas gostei da sua solução, não sou um expert no assunto, aprendi tudo q sei de expressões aki no guj e com o Mantu, mas vc pode me explicar o que é o DOTALL e Ignore Case?
Obrigado

T

a) “.” pode representar duas coisas:

  • Qualquer caracter, exceto quebras de linha ("\r", “\n”, etc.)
  • Qualquer caracter, incluindo quebras de linha.
    Quando usamos “(?s)”, ele usa a segunda interpretação.

b) “(?i)” indica que o padrão funciona com maiúsculas e minúsculas (ignora a diferença entre maiúsculas e minúsculas). Você quer pegar com o tag “</tr>” e com o tag “</TR>”, ou até com “</Tr>”.

Criado 4 de setembro de 2006
Ultima resposta 4 de set. de 2006
Respostas 10
Participantes 3