2010-02-25 17 views
32

¿Hay alguna manera de extraer todas las direcciones de correo electrónico de un texto plano usando C#.extraer todas las direcciones de correo electrónico de un texto usando C#

Por ejemplo

mi dirección de correo electrónico es [email protected] y su correo electrónico es [email protected]

debe devolver

[email protected], mrgar @ yahoo.com

He intentado lo siguiente, pero coincide con los correos electrónicos perfectos solamente.

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

Retire el^desde el inicio de la expresión regular y los $ desde el extremo. ¿Hay algún otro propósito que no sea el spam para esta actividad? – Lazarus

+0

@Lazarus no es para enviar correo no deseado, sino para rastrear la dirección web para que se pueda crear una base de datos de contactos. quitando^y $ funciona, pero tuve que agregar algunos ajustes para extraer los correos electrónicos. He publicado la respuesta. – Thunder

+0

intente esto http://stackoverflow.com/a/26274085/1604425 mucho mejor que el complejo regx – dhiraj

Respuesta

20

siguientes obras

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

¿Qué tal esta dirección: [email protected] Su patrón no extrae este tipo de direcciones. – Salaros

+0

*** para extraer todas las direcciones de correo electrónico de un texto sin formato ***, no iniciar sesión en la consola –

6

Basta con retirar el "^" desde el principio y el "$" desde el final de la cadena de filtro.

+0

eliminando^y $ funciona, pero tuvo que agregar algunos ajustes para extraer los correos electrónicos del mismo. He publicado la respuesta con esto – Thunder

4
+0

La sección " El estándar oficial: RFC 2822 "es particularmente importante si realmente quiere saber a qué se está metiendo para tratar de encontrar direcciones de correo electrónico válidas. – Guildencrantz

+0

¿Qué son RFCs para correo electrónico: RFC 1035, RFC 5322 y RFC 2822? –

+0

Gracias, artículo muy útil, se sumerge profundamente en la coincidencia de patrones; explicando claramente cada sección –

0

Si no desea que coincida con direcciones de correo electrónico perfectos, no utilice una expresión regular que coincide con direcciones de correo electrónico perfectos.

La expresión regular que está utilizando coincidirá al principio de la línea (^) y al final de la línea ($), por lo que si los elimina no se filtrará con ellos.

51

verificación de este fragmento

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()); 
    } 
} 
Cuestiones relacionadas