2010-02-25 8 views
32

C'è un modo per estrarre tutti gli indirizzi e-mail da un testo normale utilizzando C#.estrarre tutti gli indirizzi e-mail da un testo utilizzando C#

Per esempio

il mio indirizzo e-mail è [email protected] e la sua e-mail è [email protected]

dovrebbe restituire

[email protected], mrgar @ yahoo.com

Ho provato quanto segue ma corrisponde solo alle e-mail perfette.

public const string MatchEmailPattern = 
      @"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@" 
      + @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\." 
       + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|" 
      + @"([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$"; 


     public static bool IsEmail(string email) 
     { 
      if (email != null) return Regex.IsMatch(email, MatchEmailPattern); 
      else return false; 
     } 
+6

Rimuovere il^dall'inizio della regex e il $ dalla fine. C'è uno scopo diverso dallo spamming per questa attività? – Lazarus

+0

@Lazarus non è per lo spamming ma per il web che esegue la scansione dell'indirizzo in modo che possa essere creato un database di contatti! rimuovere^e $ funziona, ma ha dovuto aggiungere alcune modifiche per estrarre le email da esso. Ho postato la risposta qui. – Thunder

+0

prova questo http://stackoverflow.com/a/26274085/1604425 molto meglio del complesso regx – dhiraj

risposta

20

In seguito lavora

public static void emas(string text) 
     { 
      const string MatchEmailPattern = 
      @"(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@" 
      + @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\." 
      + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|" 
      + @"([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})"; 
      Regex rx = new Regex(MatchEmailPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
      // Find matches. 
      MatchCollection matches = rx.Matches(text); 
      // Report the number of matches found. 
      int noOfMatches = matches.Count; 
      // Report on each match. 
      foreach (Match match in matches) 
      { 
       Console.WriteLine(match.Value.ToString()); 
      } 
     } 
+1

Come su questo indirizzo: [email protected] Il tuo modello non estrae questo tipo di indirizzi. – Salaros

+0

*** per estrarre tutto l'indirizzo email da un testo normale ***, non accedere alla console –

6

Basta rimuovere "^" dall'inizio e il "$" dalla fine della stringa di filtro.

+0

rimuovendo^e $ funziona ma ha dovuto aggiungere qualche ritocco per estrarre le email da esso. Ho postato la risposta qui con – Thunder

4
+0

La sezione " Lo standard ufficiale: RFC 2822 "è particolarmente importante se vuoi veramente capire a cosa ti stai dedicando cercando di trovare indirizzi email validi. – Guildencrantz

+0

Quali sono le RFC per e-mail: RFC 1035, RFC 5322 e RFC 2822? –

+0

Grazie articolo molto utile, si tuffa in profondità nel modello di corrispondenza; spiegare chiaramente ogni sezione –

0

Se non si vuole che a indirizzi email perfetti, non usare un'espressione regolare che corrisponde indirizzi e-mail perfetti.

L'espressione regolare che si sta utilizzando corrisponderà all'inizio della riga (^) e alla fine della riga ($), quindi se rimuovi quelli non verrà filtrato con essi.

51

controllo questo frammento

using System.IO; 
using System.Text.RegularExpressions; 
using System.Text; 

class MailExtracter 
{ 

    public static void ExtractEmails(string inFilePath, string outFilePath) 
    { 
     string data = File.ReadAllText(inFilePath); //read File 
     //instantiate with this pattern 
     Regex emailRegex = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", 
      RegexOptions.IgnoreCase); 
     //find items that matches with our pattern 
     MatchCollection emailMatches = emailRegex.Matches(data); 

     StringBuilder sb = new StringBuilder(); 

     foreach (Match emailMatch in emailMatches) 
     { 
      sb.AppendLine(emailMatch.Value); 
     } 
     //store to file 
     File.WriteAllText(outFilePath, sb.ToString()); 
    } 
} 
Problemi correlati