Olá pessoal, estou tentando utilizar o exemplo abaixo para extrair emails de um arquivo texto.
try {
FileReader reader = new FileReader(new File("arquivo.txt"));
BufferedReader leitor = new BufferedReader(reader);
String emails = leitor.readLine(); // Se estiver tudo em uma
// linha...
// Expressao regular para detectar email
String patternEmail = "[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})";
Pattern padrao = Pattern.compile(patternEmail);
Matcher matcher = padrao.matcher(emails);
while (matcher.find()) {
MatchResult matchResult = matcher.toMatchResult();
System.out.println(matchResult.group());
}
} catch (Exception e) {
e.printStackTrace();
}
O problema é que ele está pegando todo o conteúdo da linha em vez de pegar somente o e-mail. Como faria pra pegar somente os e-mails dentro de um texto com várias linhas?
Descontando o fato que você está usando uma expressão regular “antiga” que não pega algumas extensões (como .info ou .mobi), você poderia fazer isto aqui:
import java.io.*;
import java.util.*;
import java.util.regex.*;
class FiltrarEmails {
private static final String ENCODING = "ISO-8859-1";
// Note que o padrão abaixo não pega os padrões do tipo ".info" ou ".museum" ou ".mobi"
private static final Pattern pat = Pattern.compile ("[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,3})", Pattern.CASE_INSENSITIVE);
public void filtrar (File arquivo) {
BufferedReader br = null;
try {
br = new BufferedReader (new InputStreamReader (new FileInputStream (arquivo), ENCODING));
for (String linha = br.readLine(); linha != null; linha = br.readLine()) {
Matcher mat = pat.matcher (linha);
while (mat.find()) {
System.out.println (mat.group());
}
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try { if (br != null) br.close(); } catch (IOException ex2) { }
}
}
public static void main (String[] args) {
(new FiltrarEmails()).filtrar (new File ("arquivo.txt"));
}
}
Bezier, muito obrigado pela ajuda!
[quote=bezier curve]Descontando o fato que você está usando uma expressão regular “antiga” que não pega algumas extensões (como .info ou .mobi), você poderia fazer isto aqui:
public class FiltrarEmails {
private static final String ENCODING = "ISO-8859-1";
// Note que o padrão abaixo não pega os padrões do tipo ".info" ou ".museum" ou ".mobi"
private static final Pattern pat = Pattern.compile ("[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,3})", Pattern.CASE_INSENSITIVE);
private List<String> emails = new LinkedList<String>();
public List<String> filtrar (File arquivo) {
BufferedReader br = null;
try {
br = new BufferedReader (new InputStreamReader (new FileInputStream (arquivo), ENCODING));
for (String linha = br.readLine(); linha != null; linha = br.readLine()) {
Matcher mat = pat.matcher (linha);
while (mat.find()) {
//System.out.println (mat.group());
emails.add(mat.group());
}
}
//Collections.sort(emails, Collator.getInstance());
// for(String email : emails){
// System.out.println(email.toLowerCase());
// }
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try { if (br != null) br.close(); } catch (IOException ex2) { }
}
return emails;
}
// public static void main (String[] args) {
// (new FiltrarEmails()).filtrar (new File ("contatosMoinho.doc"));
// }
}
[/quote]
Amigo, implementei esse seu exemplo e deu certo, porém está imprimindo na tela duas vezes cada e-mail.
Em vez de um LinkedList use um TreeSet