Ajuda com Regex

7 respostas
_Renatu

Pessoal, tenho o seguinte codigo html:

<tr>
<td>
<input type=checkbox name=c value="1e1">
</td>
<td>
<b>Nome</b>
&lt;/td&gt;
&lt;td&gt;
[email removido]
&nbsp;
&lt;/td&gt;

Esse código se repete diversas vezes em uma pagina…
Eu quero pegar “Nome” e "[email removido]"

Com o padrao “<b>(.*?)</b>” eu consigo pegar os nomes, sossegado.

Mas para pegar os 2 eu to usando o padrao “<b>(.?)</b>.?<td>(.*?)</td>” .

Mas nao está funcionando, ele nao acha nada.

Alguma dica ou sugestao? Obrigado.

7 Respostas

Flasoft

Tente fazer isto…

public static void main(String[] args) { String str = " <tr> <td><b>Nome0</b> <input type=checkbox name=c value=\"1e1\"><b>Nome1</b> </td> <td> <b>Nome2</b> </td> <td> [email removido] </td>"; Pattern p = Pattern.compile("<b>(.*?)</b>"); Matcher m = p.matcher(str); while (m.find()){ System.out.println(m.group().replaceAll("</?b?B?>", "")); } }

_Renatu

Obrigado Flasoft pela ajuda.

Mas acho que nao expliquei bem meu problema.

Eu consegui pegar os nomes com o primeiro padrao que peguei.

Mas eu nao consegui pegar no mesmo padrao os nomes e os emails, por que parece que o tag TD nao é reconhecido pelo padrao.

Alguma sugestao?!?!?

T

Para parsear HTML é melhor usar um parser HTML; expressões regulares rapidamente ficam incontroláveis. De qualquer maneira:

import java.util.regex.*;

class ExemploRegexp {

     public static void main(String[] args) {
        String html = "<b>Nome</b>\r\n"
        + "&lt;/td&gt;\n"
        + "&lt;td&gt;\n"
        + "[email removido]\n"
        +  "\n"
        + "&lt;/td&gt;\n";
        // a) Usamos (?s) para que "." bata com "\n"
        // (você poderia também usar Pattern.compile (___, Pattern.DOTALL) 
        // mas usar (?s) permite o uso com "String.replaceAll" e outros
        // lugares onde não se pode passar os parâmetros de "Pattern.compile")
        Pattern pat = Pattern.compile ("(?s)<b>(.*?)</b>.*?&lt;td&gt;(.*?)&lt;/td&gt;");
        Matcher mat = pat.matcher (html);
        if (mat.find()) {
            for (int i = 0; i &lt= mat.groupCount(); ++i) {
                System.out.println ("Group " + i + ": [" + mat.group (i) + "]");
            }
        } else {
            System.out.println ("No matches found");
        }
    }
}
Flasoft
Tente assim:
public static void main(String[] args) {
		String str = " <tr> <td><b>Nome0</b> <td> [email removido]   </td><input type=checkbox name=c value=\"1e1\"><b>Nome1</b> <td> [email removido]   </td></td> <td> <b>Nome2</b> </td> <td> [email removido]   </td>";
		Pattern p = Pattern.compile("<b>(.*?)</b>");
		Matcher m = p.matcher(str);
		
		Pattern p2 = Pattern.compile("<td>(.*?)</td>");
		Matcher m2 = null;
		while (m.find()){
			m2 = p2.matcher(str);
			m2.find(m.start());
			System.out.println(m.group().replaceAll("</?b>", ""));
			System.out.println(m2.group().replaceAll("</?td>", ""));
		}
	}

Não sei se é o q vc precisa...

_Renatu

Obrigado thingol, funcionou perfeitamente!!!

Existe algum lugar que eu possa ler pra saber essas “manhas” como as do (?s) ??

Nao achei isso nem no tutorial da sun nem na API :cry:

T

Uai, isso está na API, mas é um pouco difícil de entender.
Alguém postou aqui no site uma URL de um livro brasileiro que ensina tudo, e mais um pouco, sobre expressões regulares.

Luca

Olá

thingol:
Alguém postou aqui no site uma URL de um livro brasileiro
que ensina tudo, e mais um pouco, sobre expressões regulares.

Portal brasileiro de Expressões Regulares :: aurelio.net:

[]s
Luca

Criado 11 de maio de 2007
Ultima resposta 11 de mai. de 2007
Respostas 7
Participantes 4