Olá pessoal, estou tentando utilizar o exemplo abaixo para extrair emails de um arquivo texto.
try{FileReaderreader=newFileReader(newFile("arquivo.txt"));BufferedReaderleitor=newBufferedReader(reader);Stringemails=leitor.readLine();// Se estiver tudo em uma// linha...// Expressao regular para detectar emailStringpatternEmail="[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})";Patternpadrao=Pattern.compile(patternEmail);Matchermatcher=padrao.matcher(emails);while(matcher.find()){MatchResultmatchResult=matcher.toMatchResult();System.out.println(matchResult.group());}}catch(Exceptione){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:
importjava.io.*;importjava.util.*;importjava.util.regex.*;classFiltrarEmails{privatestaticfinalStringENCODING="ISO-8859-1";// Note que o padrão abaixo não pega os padrões do tipo ".info" ou ".museum" ou ".mobi"privatestaticfinalPatternpat=Pattern.compile("[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,3})",Pattern.CASE_INSENSITIVE);publicvoidfiltrar(Filearquivo){BufferedReaderbr=null;try{br=newBufferedReader(newInputStreamReader(newFileInputStream(arquivo),ENCODING));for(Stringlinha=br.readLine();linha!=null;linha=br.readLine()){Matchermat=pat.matcher(linha);while(mat.find()){System.out.println(mat.group());}}}catch(IOExceptionex){ex.printStackTrace();}finally{try{if(br!=null)br.close();}catch(IOExceptionex2){}}}publicstaticvoidmain(String[]args){(newFiltrarEmails()).filtrar(newFile("arquivo.txt"));}}
R
rcartaxo
Bezier, muito obrigado pela ajuda!
R
rcartaxo
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:
publicclassFiltrarEmails{privatestaticfinalStringENCODING="ISO-8859-1";// Note que o padrão abaixo não pega os padrões do tipo ".info" ou ".museum" ou ".mobi" privatestaticfinalPatternpat=Pattern.compile("[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,3})",Pattern.CASE_INSENSITIVE);privateList<String>emails=newLinkedList<String>();publicList<String>filtrar(Filearquivo){BufferedReaderbr=null;try{br=newBufferedReader(newInputStreamReader(newFileInputStream(arquivo),ENCODING));for(Stringlinha=br.readLine();linha!=null;linha=br.readLine()){Matchermat=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(IOExceptionex){ex.printStackTrace();}finally{try{if(br!=null)br.close();}catch(IOExceptionex2){}}returnemails;}// public static void main (String[] args) { // (new FiltrarEmails()).filtrar (new File ("contatosMoinho.doc")); // } }
Amigo, implementei esse seu exemplo e deu certo, porém está imprimindo na tela duas vezes cada e-mail.