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
Regex
10 Respostas
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?
Isso mesmo, quero pegar tudo o que esta entre essas duas tags, ela se extende por varias linhas
< tr >
bla bla bla
adsfadsfdsaf
</ tr >
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
Olha só, essa regex aqui:
String regex = "<tr>(.|\n|\r|\\x0B)*?</tr>" casou com todo elemento <tr>blablabla...</tr>, mesmo pulando linha lá dentro.
Veja se funciona aí, e qq dúvida, pergunte, ok?
Verdade o que o thingol falou viu! Se tiver coisa aninhada ou mal formada, vc vai estar com problemas sérios…
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
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("
Então vamos lá.
import java.util.regex.*;
class TesteRegex {
public static void main(String[] args) {
String str = "<tr>Uma tabela\ncujos elementos\r\nestendem-se por <b>várias</b>linhas</TR>";
// ?s = DOTALL, ?i = Ignore Case
Pattern pat = Pattern.compile ("(?si)<tr>(.*)</tr>");
Matcher mat = pat.matcher(str);
if (mat.find()) {
System.out.println (mat.group());
}
}
}
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
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>”.