2010-02-25 7 views
32

Есть ли способ извлечь все адреса электронной почты из обычного текста с помощью C#.извлечь весь адрес электронной почты из текста с помощью C#

Например

мой адрес электронной почты [email protected] и его электронная почта [email protected]

должен вернуть

[email protected], mrgar @ yahoo.com

Я пробовал следующее, но он идеально подходит для электронных писем.

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

Снимите^с начала регулярных выражений и $ с конца. Есть ли другая цель, кроме спама для этой деятельности? – Lazarus

+0

@Lazarus это не для рассылки спама, а для веб-сканирования по общему адресу, чтобы можно было создать базу данных контактов! удаление^и $ работает, но пришлось добавить некоторые хитрости, чтобы извлечь из него электронные письма. Я отправил ответ на этот вопрос. – Thunder

+0

попробуйте этот http://stackoverflow.com/a/26274085/1604425 намного лучше, чем сложный regx – dhiraj

ответ

20

После работы

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

Как насчет этого адреса: [email protected] Ваш шаблон не извлекает эти адреса. – Salaros

+0

*** для извлечения всего адреса электронной почты из простого текста ***, а не для входа в консоль –

6

Просто удалите «^» с начала и «$» с конца строки фильтра.

+0

, удаляя^и $, но должен был добавить некоторые хитрости, чтобы извлечь из него электронные письма. Я отправил здесь ответ – Thunder

4

дать этому попытку http://www.regular-expressions.info/email.html

+0

Раздел " Официальный стандарт: RFC 2822 "особенно важен, если вы действительно хотите понять, к чему вы клоните, пытаясь найти действительные адреса электронной почты. – Guildencrantz

+0

Какие RFC для электронной почты: RFC 1035, RFC 5322 и RFC 2822? –

+0

Спасибо, очень полезная статья, она погружается глубоко в соответствие шаблону; ясно объясняя каждый раздел –

0

Если вы не хотите, чтобы соответствовать идеальным адресам электронной почты, не используйте регулярное выражение, которое соответствует совершенным адресам электронной почты.

Регулярное выражение, которое вы используете, будет совпадать в начале строки (^) и в конце строки ($), поэтому, если вы удалите их, они не будут фильтроваться вместе с ними.

51

проверить этот фрагмент

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()); 
    } 
} 
Смежные вопросы