Extrair email + Arquivo texto + Expressão Regular

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

Obrigado entanglement.

Até mais.