2010-02-25 76 views
32

Có cách nào để trích xuất tất cả địa chỉ email từ văn bản thuần túy bằng C# hay không.trích xuất tất cả địa chỉ email từ văn bản bằng cách sử dụng C#

Ví dụ

địa chỉ email của tôi là [email protected] và email của mình là [email protected]

nên trở

[email protected], mrgar @ yahoo.com

Tôi đã thử những điều sau đây nhưng nó chỉ phù hợp với các email hoàn hảo.

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

Tháo^ngay từ đầu của regex và $ từ kết thúc. Có mục đích nào khác ngoài việc gửi spam cho hoạt động này không? – Lazarus

+0

@ Lazarus của nó không phải để gửi spam nhưng để thu thập thông tin trên web địa chỉ để cơ sở dữ liệu liên hệ có thể được thực hiện! loại bỏ^và $ hoạt động nhưng phải thêm một số chỉnh sửa để trích xuất các email từ nó. Tôi đã đăng câu trả lời theo đây. – Thunder

+0

thử http://stackoverflow.com/a/26274085/1604425 này tốt hơn nhiều so với regx phức tạp – dhiraj

Trả lời

20

Tiếp theo việc

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

Làm thế nào về địa chỉ này: [email protected] Mẫu của bạn không trích xuất các loại địa chỉ này. – Salaros

+0

*** để trích xuất tất cả địa chỉ email từ văn bản thuần túy ***, không đăng nhập vào bảng điều khiển –

6

Chỉ cần xóa "^" ngay từ đầu và "$" từ cuối chuỗi bộ lọc của bạn.

+0

xóa^và $ công trình nhưng phải thêm một số chỉnh sửa để trích xuất các email từ nó. Tôi đã đăng câu trả lời theo đây – Thunder

4
+0

Phần " Tiêu chuẩn chính thức: RFC 2822 "đặc biệt quan trọng nếu bạn thực sự muốn hiểu những gì bạn đang gặp phải khi cố tìm các địa chỉ email hợp lệ. – Guildencrantz

+0

RFC nào dành cho email: RFC 1035, RFC 5322 và RFC 2822? –

+0

Cảm ơn bạn rất hữu ích bài viết, nó lặn sâu trong phù hợp với mô hình; giải thích rõ ràng từng phần –

0

Nếu bạn không muốn nó để phù hợp với địa chỉ email hoàn hảo, không sử dụng một biểu thức chính quy phù hợp với địa chỉ email hoàn hảo.

Cụm từ thông dụng bạn đang sử dụng sẽ khớp với đầu dòng (^) và cuối dòng ($), vì vậy nếu bạn xóa những cụm từ đó, nó sẽ không lọc với chúng.

51

kiểm tra đoạn này

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()); 
    } 
} 
Các vấn đề liên quan