2013-04-17 14 views
11

La mia intenzione è di ottenere l'indirizzo email da una pagina web. Ho la fonte della pagina. Sto leggendo la fonte della pagina riga per riga. Ora voglio ottenere l'indirizzo email dalla riga corrente che sto leggendo. Questa linea corrente potrebbe avere o meno email. Ho visto un sacco di esempi regexp. Ma la maggior parte di questi sono per la convalida dell'indirizzo email. Voglio ottenere l'indirizzo email da un'origine della pagina non valida. Dovrebbe funzionare come http://emailx.discoveryvip.com/ sta lavorandoregex per trovare l'indirizzo email da una stringa

Alcune linee di ingresso esempi sono:

1)<p>Send details to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;%72%65%62%65%6b%61%[email protected]%68%61%63%6b%73%75%72%66%65%72.%63%6f%6d">[email protected]</a></p> 

2)<p>Interested should send details directly to <a href="http://www.abcdef.com/abcdef/">www.abcdef.com/abcdef/</a>. Should you have any questions, please email <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;%6a%6f%62%[email protected]%72%65%6c%61%79.%65%64%75">[email protected]</a>. 

3)Note :- Send your queries at [email protected] for more details call Mr. neeraj. 

voglio ottenere [email protected] dagli esempi 1,2 e 3. sto utilizzando Java e io non sono bravo a rexexp. Aiutami.

+1

Hai controllato cosa dice Google su "java regex email"? – Vitaly

+0

controlla l'origine della pagina di http://emailx.discoveryvip.com/. Hanno dato il metodo per estrarre la posta elettronica. Ma voglio una versione java – Neeraj

+2

Che cosa hai provato? Stack Overflow è un sito di domande e risposte, non un sito "do my work for me". Mostraci quello che hai in modo che possiamo aiutarti con il tuo problema specifico. –

risposta

10

È possibile convalidare formati di indirizzo di posta elettronica, come in base alla RFC 2822, con questo:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

ed ecco una spiegazione da regular-expressions.info:

Questa espressione regolare ha due parti: la parte prima della @ e la parte dopo la @. Ci sono due alternative per la parte prima della @: può consistere in una serie di lettere, cifre e certi simboli, inclusi uno o più punti. Tuttavia, i punti potrebbero non apparire consecutivamente o all'inizio o alla fine dell'indirizzo email. L'altra alternativa richiede che la parte prima della @ sia racchiusa tra virgolette doppie, consentendo qualsiasi stringa di caratteri ASCII tra le virgolette. Caratteri bianchi, doppi apici e barre retroverse devono essere preceduti da barre rovesciate.

E potete verificarlo qui: Rubular example.

+0

Grazie mille NomNomBot. Sto provando con il tuo regexp. – Neeraj

+0

Assicurati di sfuggire alla barra, alla barra rovesciata, ecc. –

+0

Sì. Fatto. E funziona correttamente. Grazie. – Neeraj

2

avete bisogno di qualcosa di simile espressione regolare:

".*(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b).*" 

Quando si corrisponde, è possibile estrarre il primo gruppo e che sarà la tua email.

String regex = ".*(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b).*"; 
Pattern p = Pattern.compile(regex); 
Matcher m = p.matcher("your text here"); 
if (m.matches()) { 
    String email = m.group(1); 
    //do somethinfg with your email 
} 
+0

Ci sono molte e-mail nel testo – Vitaly

+0

Come ottenere solo il primo testo abbinato – Stunner

+0

@Petar Ivanov Non funziona per me. –

13

Il codice corretto è

Pattern p = Pattern.compile("\\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}\\b", 
    Pattern.CASE_INSENSITIVE); 
Matcher matcher = p.matcher(input); 
Set<String> emails = new HashSet<String>(); 
while(matcher.find()) { 
    emails.add(matcher.group()); 
} 

Questo darà la lista delle mail nel lungo testo di input/html.

+1

Questo non tiene conto dei nomi di dominio che hanno più di due parti, ad esempio nel Regno Unito ci sono indirizzi come [email protected] Inoltre al giorno d'oggi hai un sacco di nuovi TLD che sono più lunghi di 4 caratteri. –

1

Questo è un modo semplice per estrarre tutte le email da stringa di input usando Patterns.EMAIL_ADDRESS:

public static List<String> getEmails(@NonNull String input) { 
     List<String> emails = new ArrayList<>(); 
     Matcher matcher = Patterns.EMAIL_ADDRESS.matcher(input); 
     while (matcher.find()) { 
      int matchStart = matcher.start(0); 
      int matchEnd = matcher.end(0); 
      emails.add(input.substring(matchStart, matchEnd)); 
     } 
     return emails; 
    } 
Problemi correlati