Mã thanh lịch nhất để xác nhận rằng một chuỗi là một địa chỉ email hợp lệ là gì?
Mã thanh lịch nhất để xác nhận rằng một chuỗi là một địa chỉ email hợp lệ là gì?
Câu trả lời:
Cái này thì sao?
bool IsValidEmail(string email)
{
try {
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch {
return false;
}
}
Để làm rõ, câu hỏi đặt ra là liệu một chuỗi cụ thể có phải là đại diện hợp lệ của địa chỉ email không, liệu địa chỉ email có phải là đích đến hợp lệ để gửi thư hay không. Đối với điều đó, cách thực sự duy nhất là gửi tin nhắn để xác nhận.
Lưu ý rằng địa chỉ e-mail dễ tha thứ hơn bạn nghĩ trước tiên. Đây là tất cả các hình thức hoàn toàn hợp lệ:
Đối với hầu hết các trường hợp sử dụng, "không hợp lệ" sai sẽ tệ hơn nhiều đối với người dùng của bạn và bằng chứng trong tương lai so với "sai" hợp lệ. Đây là một bài viết từng là câu trả lời được chấp nhận cho câu hỏi này (câu trả lời đó đã bị xóa). Nó có nhiều chi tiết hơn và một số ý tưởng khác về cách giải quyết vấn đề.
Cung cấp kiểm tra vệ sinh vẫn là một ý tưởng tốt cho trải nghiệm người dùng. Giả sử địa chỉ e-mail là hợp lệ, bạn có thể tìm các tên miền cấp cao nhất đã biết, kiểm tra tên miền cho bản ghi MX, kiểm tra lỗi chính tả từ các tên miền phổ biến (gmail.cmo), v.v. Sau đó đưa ra cảnh báo cho người dùng một cơ hội để nói "có, máy chủ thư của tôi thực sự cho phép làm địa chỉ email."
Đối với việc sử dụng xử lý ngoại lệ cho logic kinh doanh, tôi đồng ý rằng đó là một điều cần tránh. Nhưng đây là một trong những trường hợp mà sự thuận tiện và rõ ràng có thể vượt xa giáo điều.
Ngoài ra, nếu bạn làm bất cứ điều gì khác với địa chỉ e-mail, có thể sẽ liên quan đến việc chuyển nó thành MailAddress. Ngay cả khi bạn không sử dụng chức năng chính xác này, bạn có thể sẽ muốn sử dụng cùng một mẫu. Bạn cũng có thể kiểm tra các loại lỗi cụ thể bằng cách bắt các ngoại lệ khác nhau : định dạng rỗng, rỗng hoặc không hợp lệ.
Theo nhận xét của Stuart, điều này so sánh địa chỉ cuối cùng với chuỗi gốc thay vì luôn trả về đúng. MailAddress cố phân tích một chuỗi có khoảng trắng thành các phần "Tên hiển thị" và "Địa chỉ", do đó phiên bản gốc đã trả về dương tính giả.
--- Đọc thêm ---
System.Net.Mail
lớp để gửi thư, mà bạn có thể là nếu bạn đang sử dụng .NET. Chúng tôi đã đưa ra quyết định sử dụng loại xác nhận này đơn giản vì chúng tôi không chấp nhận địa chỉ email - ngay cả những địa chỉ hợp lệ - mà chúng tôi không thể gửi thư đến.
IsValidEmail("this is not valid@email$com");
Đây là một câu hỏi cũ, nhưng tất cả các câu trả lời tôi đã tìm thấy trên SO, bao gồm cả những câu hỏi gần đây hơn, đều được trả lời tương tự như câu hỏi này. Tuy nhiên, trong .Net 4.5 / MVC 4, bạn có thể thêm xác thực địa chỉ email vào một biểu mẫu bằng cách thêm chú thích [EmailAddress] từ System.ComponentModel.DataAnnotations, vì vậy tôi đã tự hỏi tại sao tôi không thể sử dụng chức năng tích hợp từ đó. Net nói chung.
Điều này có vẻ hiệu quả và đối với tôi khá thanh lịch:
using System.ComponentModel.DataAnnotations;
class ValidateSomeEmails
{
static void Main(string[] args)
{
var foo = new EmailAddressAttribute();
bool bar;
bar = foo.IsValid("someone@somewhere.com"); //true
bar = foo.IsValid("someone@somewhere.co.uk"); //true
bar = foo.IsValid("someone+tag@somewhere.net"); //true
bar = foo.IsValid("futureTLD@somewhere.fooo"); //true
bar = foo.IsValid("fdsa"); //false
bar = foo.IsValid("fdsa@"); //false
bar = foo.IsValid("fdsa@fdsa"); //false
bar = foo.IsValid("fdsa@fdsa."); //false
//one-liner
if (new EmailAddressAttribute().IsValid("someone@somewhere.com"))
bar = true;
}
}
EmailAddressAttribute
ít được phép hơn System.Net.Mail.MailAddress
- ví dụ, MailAddress
chấp nhận một địa chỉ cho TLD. Chỉ cần một cái gì đó để ghi nhớ nếu bạn cần phải được cho phép càng tốt.
foo.IsValid(null);
trả lại true
.
Tôi sử dụng phương pháp lót đơn này có tác dụng với tôi-
using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
return new EmailAddressAttribute().IsValid(source);
}
Theo các bình luận, điều này sẽ "thất bại" nếu source
(địa chỉ email) là null.
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
false
chuỗi null. Đó là lý do tại sao tôi đề xuất phiên bản ++ (thậm chí tốt hơn tốt hơn) : public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
. Bây giờ tôi sẽ đi và tìm thấy Nhà thờ Cải cách của những người lập trình tốt hơn nữa.
.net 4.5 đã thêm System.ComponentModel.DataAnnotations.EmailAddressAttribution
Bạn có thể duyệt qua nguồn của EmailAddressAttribution , đây là Regex mà nó sử dụng trong nội bộ:
const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";
RegexOptions.IgnoreCase
vì mẫu này không cho phép chữ in hoa rõ ràng!
Tôi lấy câu trả lời của Phil từ số 1 và tạo ra lớp này. Gọi nó như thế này:bool isValid = Validator.EmailIsValid(emailString);
Đây là lớp học:
using System.Text.RegularExpressions;
public static class Validator
{
static Regex ValidEmailRegex = CreateValidEmailRegex();
/// <summary>
/// Taken from http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx
/// </summary>
/// <returns></returns>
private static Regex CreateValidEmailRegex()
{
string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
+ @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
+ @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
return new Regex(validEmailPattern, RegexOptions.IgnoreCase);
}
internal static bool EmailIsValid(string emailAddress)
{
bool isValid = ValidEmailRegex.IsMatch(emailAddress);
return isValid;
}
}
Cá nhân, tôi sẽ nói rằng bạn chỉ cần đảm bảo có biểu tượng @ trong đó, có thể là a. tính cách. Có nhiều biểu thức bạn có thể sử dụng với độ chính xác khác nhau, nhưng tôi nghĩ rằng hầu hết các địa chỉ này đều bỏ qua các địa chỉ email hợp lệ hoặc để những địa chỉ không hợp lệ thông qua. Nếu mọi người muốn đặt một địa chỉ email giả, họ sẽ đặt một địa chỉ giả. Nếu bạn cần xác minh rằng địa chỉ email là hợp pháp và người đó kiểm soát địa chỉ email đó, thì bạn sẽ cần gửi cho họ một email có liên kết được mã hóa đặc biệt để họ có thể xác minh rằng đó thực sự là một địa chỉ thực.
Tôi nghĩ rằng cách tốt nhất là như sau:
public static bool EmailIsValid(string email)
{
string expression = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
if (Regex.IsMatch(email, expression))
{
if (Regex.Replace(email, expression, string.Empty).Length == 0)
{
return true;
}
}
return false;
}
Bạn có thể có hàm tĩnh này trong một lớp chung.
Mã ngắn và chính xác
string Email = txtEmail.Text;
if (Email.IsValidEmail())
{
//use code here
}
public static bool IsValidEmail(this string email)
{
string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|" + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
return regex.IsMatch(email);
}
Cách thanh lịch nhất là sử dụng các phương thức được xây dựng của .Net.
Những phương pháp sau:
Được thử và kiểm tra. Những phương pháp này được sử dụng trong các dự án chuyên nghiệp của riêng tôi.
Sử dụng các biểu thức chính quy trong nội bộ, đáng tin cậy và nhanh chóng.
Được sản xuất bởi Microsoft cho C #. Không cần phải phát minh lại bánh xe.
Trả về một kết quả bool. Đúng có nghĩa là email hợp lệ.
Đối với người dùng .Net 4.5 trở lên
Thêm tài liệu tham khảo này vào dự án của bạn:
System.ComponentModel.DataAnnotations
Bây giờ bạn có thể sử dụng mã sau đây:
(new EmailAddressAttribute().IsValid("youremailhere@test.test"));
Ví dụ sử dụng
Dưới đây là một số phương pháp để khai báo:
protected List<string> GetRecipients() // Gets recipients from TextBox named `TxtRecipients`
{
List<string> MethodResult = null;
try
{
List<string> Recipients = TxtRecipients.Text.Replace(",",";").Replace(" ", "").Split(';').ToList();
List<string> RecipientsCleaned = new List<string>();
foreach (string Recipient in RecipientsCleaned)
{
if (!String.IsNullOrWhiteSpace(Recipient))
{
RecipientsNoBlanks.Add(Recipient);
}
}
MethodResult = RecipientsNoBlanks;
}
catch//(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
public static bool IsValidEmailAddresses(List<string> recipients)
{
List<string> InvalidAddresses = GetInvalidEmailAddresses(recipients);
return InvalidAddresses != null && InvalidAddresses.Count == 0;
}
public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
List<string> MethodResult = null;
try
{
List<string> InvalidEmailAddresses = new List<string>();
foreach (string Recipient in recipients)
{
if (!(new EmailAddressAttribute().IsValid(Recipient)) && !InvalidEmailAddresses.Contains(Recipient))
{
InvalidEmailAddresses.Add(Recipient);
}
}
MethodResult = InvalidEmailAddresses;
}
catch//(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
... và mã chứng minh chúng hoạt động:
List<string> Recipients = GetRecipients();
bool IsValidEmailAddresses = IsValidEmailAddresses(Recipients);
if (IsValidEmailAddresses)
{
//Emails are valid. Your code here
}
else
{
StringBuilder sb = new StringBuilder();
sb.Append("The following addresses are invalid:");
List<string> InvalidEmails = GetInvalidEmailAddresses(Recipients);
foreach (string InvalidEmail in InvalidEmails)
{
sb.Append("\n" + InvalidEmail);
}
MessageBox.Show(sb.ToString());
}
Ngoài ra, ví dụ này:
;
.Thay thế, đối với người dùng phiên bản .Net nhỏ hơn 4,5
Đối với các tình huống .Net 4.5 không khả dụng, tôi sử dụng giải pháp sau:
Cụ thể, tôi sử dụng:
public static bool IsValidEmailAddress(string emailAddress)
{
bool MethodResult = false;
try
{
MailAddress m = new MailAddress(emailAddress);
MethodResult = m.Address == emailAddress;
}
catch //(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
List<string> MethodResult = null;
try
{
List<string> InvalidEmailAddresses = new List<string>();
foreach (string Recipient in recipients)
{
if (!IsValidEmail(Recipient) && !InvalidEmailAddresses.Contains(Recipient))
{
InvalidEmailAddresses.Add(Recipient);
}
}
MethodResult = InvalidEmailAddresses;
}
catch //(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
Thành thật mà nói, trong mã sản xuất, điều tốt nhất tôi làm là kiểm tra một @
biểu tượng.
Tôi không bao giờ ở một nơi để xác nhận hoàn toàn các email. Bạn biết làm thế nào tôi thấy nếu nó thực sự hợp lệ? Nếu nó được gửi đi. Nếu nó không, nó xấu, nếu nó đã làm, cuộc sống là tốt. Đó là tất cả những gì tôi cần biết.
Tôi thấy regex này là một sự đánh đổi tốt giữa việc kiểm tra một cái gì đó hơn là chỉ dấu @ và chấp nhận các trường hợp cạnh kỳ lạ:
^[^@\s]+@[^@\s]+(\.[^@\s]+)+$
Nó ít nhất sẽ khiến bạn đặt một cái gì đó xung quanh dấu @ và đặt ít nhất một miền trông bình thường.
bob@companyinternal
?
Xác thực địa chỉ email không dễ dàng như nó có vẻ. Về mặt lý thuyết, thực tế không thể xác thực hoàn toàn một địa chỉ email chỉ bằng một biểu thức thông thường.
Kiểm tra bài đăng trên blog của tôi về nó để thảo luận về chủ đề này và triển khai F # bằng cách sử dụng FParsec. [/ shaming_plug]
Đây là câu trả lời của tôi - Giải pháp của Phil không thành công cho các tên miền đơn như "someone@q.com". Dù bạn có tin hay không, điều đó được sử dụng =) (ví dụ, đi đến centurylink).
Câu trả lời của Phil cũng sẽ chỉ hoạt động với tiêu chuẩn PCRE ... vì vậy C # sẽ lấy nó, nhưng javascript sẽ đánh bom. Nó quá phức tạp đối với javascript. Vì vậy, bạn không thể sử dụng giải pháp của Phil cho các thuộc tính xác thực mvc.
Đây là regex của tôi. Nó sẽ hoạt động độc đáo với các thuộc tính xác thực MVC.
- Mọi thứ trước khi @ được đơn giản hóa, để ít nhất javascript sẽ hoạt động. Tôi ổn khi xác nhận thư giãn ở đây miễn là máy chủ trao đổi không cung cấp cho tôi 5.1.3. - Mọi thứ sau @ là giải pháp của Phil được sửa đổi cho các tên miền đơn.
public const string EmailPattern =
@"^\s*[\w\-\+_']+(\.[\w\-\+_']+)*\@[A-Za-z0-9]([\w\.-]*[A-Za-z0-9])?\.[A-Za-z][A-Za-z\.]*[A-Za-z]$";
Đối với những người đề xuất sử dụng system.net.mail MailMessage (), điều đó là CÁCH để linh hoạt. Chắc chắn, C # sẽ chấp nhận email, nhưng sau đó máy chủ trao đổi sẽ đánh bom với lỗi thời gian chạy 5.1.3 ngay khi bạn cố gắng gửi email.
basket@ball
như một địa chỉ email hợp lệ đã có được câu trả lời chính xác cũng như tất cả các upvote đó. Dù sao cũng cảm ơn bạn!
Nếu bạn thực sự và tôi có nghĩa là thực sự muốn biết nếu một địa chỉ email là hợp lệ ... hãy yêu cầu trao đổi thư để chứng minh nó, không cần regex. Tôi có thể cung cấp mã nếu được yêu cầu.
Các bước chung như sau: 1. địa chỉ email có một phần tên miền không? (chỉ mục của @> 0) 2. sử dụng truy vấn DNS hỏi xem tên miền có bộ trao đổi thư 3. mở kết nối tcp với bộ trao đổi thư 4. sử dụng giao thức smtp, mở thư tới máy chủ bằng địa chỉ email làm người nhận 5. phân tích phản hồi của máy chủ. 6. bỏ tin nhắn nếu bạn thực hiện đến nay, mọi thứ đều tốt.
Đây là như bạn có thể tưởng tượng, thời gian rất tốn kém khôn ngoan và dựa vào smtp, nhưng nó hoạt động.
Nói chung, một biểu thức thông thường để xác thực địa chỉ email không phải là một điều dễ dàng để đưa ra; tại thời điểm viết bài này, cú pháp của một địa chỉ email phải tuân theo số lượng tiêu chuẩn tương đối cao và việc thực hiện tất cả chúng trong một biểu thức chính quy là thực tế không khả thi!
Tôi thực sự khuyên bạn nên dùng thử EmailVerify.NET , một thư viện .NET trưởng thành có thể xác thực các địa chỉ email theo sau tất cả các tiêu chuẩn IETF hiện tại (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 và RFC 5322) , kiểm tra các bản ghi DNS liên quan, kiểm tra xem các hộp thư đích có thể chấp nhận tin nhắn hay không và thậm chí có thể biết liệu một địa chỉ đã cho có dùng được hay không.
Tuyên bố miễn trừ trách nhiệm: Tôi là nhà phát triển chính cho thành phần này.
For the simple email like goerge@xxx.com, below code is sufficient.
public static bool ValidateEmail(string email)
{
System.Text.RegularExpressions.Regex emailRegex = new System.Text.RegularExpressions.Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
System.Text.RegularExpressions.Match emailMatch = emailRegex.Match(email);
return emailMatch.Success;
}
Trong trường hợp bạn đang sử dụng FluentValidation, bạn có thể viết một cái gì đó đơn giản như thế này:
public cass User
{
public string Email { get; set; }
}
public class UserValidator : AbstractValidator<User>
{
public UserValidator()
{
RuleFor(x => x.Email).EmailAddress().WithMessage("The text entered is not a valid email address.");
}
}
// Validates an user.
var validationResult = new UserValidator().Validate(new User { Email = "açflkdj" });
// This will return false, since the user email is not valid.
bool userIsValid = validationResult.IsValid;
một chút sửa đổi để trả lời @Cogwheel
public static bool IsValidEmail(this string email)
{
// skip the exception & return early if possible
if (email.IndexOf("@") <= 0) return false;
try
{
var address = new MailAddress(email);
return address.Address == email;
}
catch
{
return false;
}
}
Console.WriteLine(MailAddress("asdf@asdf.").Address);
xuất ra "asdf @ asdf.", Không hợp lệ.
Có rất nhiều câu trả lời mạnh mẽ ở đây. Tuy nhiên, tôi khuyên chúng ta nên lùi lại một bước. @Cogwheel trả lời câu hỏi https://stackoverflow.com/a/1374644/388267 . Tuy nhiên, nó có thể tốn kém trong một kịch bản xác nhận hàng loạt, nếu nhiều địa chỉ email được xác thực là không hợp lệ. Tôi đề nghị rằng chúng tôi sử dụng một chút logic trước khi chúng tôi tham gia vào khối thử bắt của anh ấy. Tôi biết rằng đoạn mã sau có thể được viết bằng RegEx nhưng điều đó có thể tốn kém cho các nhà phát triển mới hiểu. Đây là giá trị gấp đôi của tôi:
public static bool IsEmail(this string input)
{
if (string.IsNullOrWhiteSpace(input)) return false;
// MUST CONTAIN ONE AND ONLY ONE @
var atCount = input.Count(c => c == '@');
if (atCount != 1) return false;
// MUST CONTAIN PERIOD
if (!input.Contains(".")) return false;
// @ MUST OCCUR BEFORE LAST PERIOD
var indexOfAt = input.IndexOf("@", StringComparison.Ordinal);
var lastIndexOfPeriod = input.LastIndexOf(".", StringComparison.Ordinal);
var atBeforeLastPeriod = lastIndexOfPeriod > indexOfAt;
if (!atBeforeLastPeriod) return false;
// CODE FROM COGWHEEL'S ANSWER: https://stackoverflow.com/a/1374644/388267
try
{
var addr = new System.Net.Mail.MailAddress(input);
return addr.Address == input;
}
catch
{
return false;
}
}
Câu trả lời được bình chọn nhiều nhất từ @Cogwheel là câu trả lời tốt nhất tuy nhiên tôi đã cố gắng thực hiện trim()
phương thức chuỗi để nó sẽ cắt tất cả khoảng trắng của người dùng từ đầu chuỗi đến hết. Kiểm tra mã dưới đây cho ví dụ đầy đủ-
bool IsValidEmail(string email)
{
try
{
email = email.Trim();
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch
{
return false;
}
}
SanitizeEmail(string email)
, sử dụng kết quả của phương thức đó để xác nhận và gửi email đến.
private static bool IsValidEmail(string emailAddress)
{
const string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
+ @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
+ @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
return new Regex(validEmailPattern, RegexOptions.IgnoreCase).IsMatch(emailAddress);
}
Kiểm tra chuỗi email có đúng định dạng hoặc định dạng sai bằng cách System.Text.RegularExpressions
:
public static bool IsValidEmailId(string InputEmail)
{
Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
Match match = regex.Match(InputEmail);
if (match.Success)
return true;
else
return false;
}
protected void Email_TextChanged(object sender, EventArgs e)
{
String UserEmail = Email.Text;
if (IsValidEmailId(UserEmail))
{
Label4.Text = "This email is correct formate";
}
else
{
Label4.Text = "This email isn't correct formate";
}
}
/ Sử dụng Regex nội bộ được sử dụng trong việc tạo "EmailAddressAttribution ();" thành phần trong .Net4.5 >>> sử dụng System.ComponentModel.DataAnnotations; // Để xác thực một địa chỉ email ...... Đã kiểm tra và làm việc.
public bool IsEmail(string email)
{
if (String.IsNullOrEmpty(email))
{ return false; }
try
{
Regex _regex = new Regex("^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])" +
"+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)" +
"((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|" +
"[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\u" +
"FDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|" +
"(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|" +
"[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900" +
"-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF" +
"EF])))\\.?$", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
return _regex.IsMatch(email);
}
catch (RegexMatchTimeoutException)
{
return false;
}
}
Ngoài ra, bạn có thể sử dụng điều này:
http://msdn.microsoft.com/en-us/l Library / 01escwtf (v = vs.110) .aspx
Tôi rút gọn câu trả lời của Poyson 1 như vậy:
public static bool IsValidEmailAddress(string candidateEmailAddr)
{
string regexExpresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
return (Regex.IsMatch(candidateEmailAddr, regexExpresion)) &&
(Regex.Replace(candidateEmailAddr, regexExpresion, string.Empty).Length == 0);
}
Cách đơn giản để xác định emailid có hợp lệ hay không.
public static bool EmailIsValid(string email)
{
return Regex.IsMatch(email, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
Có vấn đề về văn hóa trong regex trong C # chứ không phải js. Vì vậy, chúng ta cần sử dụng regex trong chế độ Hoa Kỳ để kiểm tra email. Nếu bạn không sử dụng chế độ ECMAScript, các ký tự đặc biệt ngôn ngữ của bạn sẽ ngụ ý trong AZ với regex.
Regex.IsMatch(email, @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9_\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.ECMAScript)
Tôi đã kết thúc bằng cách sử dụng regex này, vì nó xác nhận thành công dấu phẩy, nhận xét, ký tự Unicode và địa chỉ tên miền IP (v4).
Địa chỉ hợp lệ sẽ là:
"" @ example.org
(comment)test@example.org
тест@example.org
ტესტი @ example.org
kiểm tra @ [192.168.1.1]
public const string REGEX_EMAIL = @"^(((\([\w!#$%&'*+\/=?^_`{|}~-]*\))?[^<>()[\]\\.,;:\s@\""]+(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))(\([\w!#$%&'*+\/=?^_`{|}~-]*\))?@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$";
Một cách đơn giản mà không cần sử dụng Regex (điều mà tôi không thích vì khả năng đọc kém):
bool IsValidEmail(string email)
{
string emailTrimed = email.Trim();
if (!string.IsNullOrEmpty(emailTrimed))
{
bool hasWhitespace = emailTrimed.Contains(" ");
int indexOfAtSign = emailTrimed.LastIndexOf('@');
if (indexOfAtSign > 0 && !hasWhitespace)
{
string afterAtSign = emailTrimed.Substring(indexOfAtSign + 1);
int indexOfDotAfterAtSign = afterAtSign.LastIndexOf('.');
if (indexOfDotAfterAtSign > 0 && afterAtSign.Substring(indexOfDotAfterAtSign).Length > 1)
return true;
}
}
return false;
}
Ví dụ:
IsValidEmail("@b.com") // false
IsValidEmail("a@.com") // false
IsValidEmail("a@bcom") // false
IsValidEmail("a.b@com") // false
IsValidEmail("a@b.") // false
IsValidEmail("a b@c.com") // false
IsValidEmail("a@b c.com") // false
IsValidEmail("a@b.com") // true
IsValidEmail("a@b.c.com") // true
IsValidEmail("a+b@c.com") // true
IsValidEmail("a@123.45.67.89") // true
Điều này có nghĩa là đơn giản và do đó, nó không giải quyết các trường hợp hiếm gặp như email có tên miền có dấu cách chứa khoảng trắng (thường được cho phép), email có địa chỉ IPv6, v.v.
Đây là một câu trả lời cho câu hỏi của bạn để bạn kiểm tra.
using System;
using System.Globalization;
using System.Text.RegularExpressions;
public class RegexUtilities
{
public bool IsValidEmail(string strIn)
{
if (String.IsNullOrEmpty(strIn))
{
return false;
}
// Use IdnMapping class to convert Unicode domain names.
try
{
strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper, RegexOptions.None, TimeSpan.FromMilliseconds(200));
}
catch (RegexMatchTimeoutException)
{
return false;
}
if (invalid)
{
return false;
}
// Return true if strIn is in valid e-mail format.
try
{
return Regex.IsMatch(strIn, @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))| [-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$", RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}
catch (RegexMatchTimeoutException)
{
return false;
}
}
private string DomainMapper(Match match)
{
// IdnMapping class with default property values.
IdnMapping idn = new IdnMapping();
string domainName = match.Groups[2].Value;
try
{
domainName = idn.GetAscii(domainName);
}
catch (ArgumentException)
{
invalid = true;
}
return match.Groups[1].Value + domainName;
}
}
Dựa trên câu trả lời của @Cogwheel, tôi muốn chia sẻ một giải pháp sửa đổi hoạt động cho SSIS và "Thành phần tập lệnh":
Đặt mã này theo đúng phương pháp:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
string email = Row.fieldName;
try
{
System.Net.Mail.MailAddress addr = new System.Net.Mail.MailAddress(email);
Row.fieldName= addr.Address.ToString();
}
catch
{
Row.fieldName = "WRONGADDRESS";
}
}
Sau đó, bạn có thể sử dụng Phân chia có điều kiện để lọc tất cả các bản ghi không hợp lệ hoặc bất cứ điều gì bạn muốn làm.