รหัสที่หรูหราที่สุดในการตรวจสอบความถูกต้องของสตริงคือที่อยู่อีเมลที่ถูกต้อง
รหัสที่หรูหราที่สุดในการตรวจสอบความถูกต้องของสตริงคือที่อยู่อีเมลที่ถูกต้อง
คำตอบ:
แล้วเรื่องนี้ล่ะ
bool IsValidEmail(string email)
{
try {
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch {
return false;
}
}
เพื่อชี้แจงคำถามที่ถามว่าสตริงที่เฉพาะเจาะจงเป็นตัวแทนที่ถูกต้องของที่อยู่อีเมลไม่ว่าที่อยู่อีเมลเป็นปลายทางที่ถูกต้องในการส่งข้อความ สำหรับวิธีการเดียวที่แท้จริงคือการส่งข้อความเพื่อยืนยัน
โปรดทราบว่าที่อยู่อีเมลมีการให้อภัยมากกว่าที่คุณคิดเอาไว้ก่อน เหล่านี้เป็นรูปแบบที่ถูกต้องสมบูรณ์แบบ:
สำหรับกรณีการใช้งานส่วนใหญ่เท็จ "ไม่ถูกต้อง" จะเลวร้ายยิ่งสำหรับผู้ใช้ของคุณและการพิสูจน์ในอนาคตมากกว่า "ถูกต้อง" เท็จ นี่คือบทความที่เคยเป็นคำตอบที่ยอมรับสำหรับคำถามนี้ (คำตอบนั้นถูกลบไปแล้ว) มีรายละเอียดมากขึ้นและแนวคิดอื่น ๆ เกี่ยวกับวิธีการแก้ปัญหา
การให้การตรวจสอบสติยังคงเป็นความคิดที่ดีสำหรับประสบการณ์ของผู้ใช้ สมมติว่าที่อยู่อีเมลนั้นถูกต้องคุณสามารถค้นหาโดเมนระดับบนสุดที่เป็นที่รู้จักตรวจสอบโดเมนสำหรับระเบียน MX ตรวจสอบข้อผิดพลาดการสะกดคำจากชื่อโดเมนทั่วไป (gmail.cmo) ฯลฯ จากนั้นแสดงคำเตือนให้ผู้ใช้ โอกาสที่จะพูดว่า "ใช่เซิร์ฟเวอร์อีเมลของฉันอนุญาต🌮🍳🎁เป็นที่อยู่อีเมล"
สำหรับการใช้การจัดการข้อยกเว้นสำหรับตรรกะทางธุรกิจฉันยอมรับว่าเป็นสิ่งที่ต้องหลีกเลี่ยง แต่นี่เป็นหนึ่งในกรณีที่ความสะดวกและความชัดเจนอาจเกินดุลความเชื่อ
นอกจากนี้หากคุณทำสิ่งอื่นด้วยที่อยู่อีเมลก็อาจจะเป็นการเปลี่ยนที่อยู่เป็น MailAddress แม้ว่าคุณจะไม่ได้ใช้ฟังก์ชั่นที่แน่นอนนี้ แต่คุณอาจต้องการใช้รูปแบบเดียวกัน นอกจากนี้คุณยังสามารถตรวจสอบความล้มเหลวบางประเภทโดยการตรวจจับข้อยกเว้นต่าง ๆ : รูปแบบว่างเปล่าว่างเปล่าหรือไม่ถูกต้อง
ต่อความคิดเห็นของ Stuart การเปรียบเทียบที่อยู่สุดท้ายกับสตริงเดิมแทนที่จะส่งกลับค่าจริงเสมอ MailAddress พยายามที่จะแยกสตริงที่มีช่องว่างใน "ชื่อที่แสดง" และ "ที่อยู่" ส่วนดังนั้นรุ่นเดิมกลับเป็นเท็จบวก
--- อ่านเพิ่มเติม ---
System.Net.Mail
คลาสเพื่อส่งจดหมายซึ่งอาจเป็นได้ว่าคุณใช้. NET เราตัดสินใจที่จะใช้การตรวจสอบความถูกต้องประเภทนี้เพียงเพราะเราไม่มีจุดรับที่อยู่อีเมล - แม้แต่ที่ถูกต้อง - ที่เราไม่สามารถส่งจดหมายไปได้
IsValidEmail("this is not valid@email$com");
นี่เป็นคำถามเก่า แต่คำตอบทั้งหมดที่ฉันพบใน SO รวมถึงคำตอบที่ใหม่กว่านั้นได้รับคำตอบคล้ายกับคำถามนี้ อย่างไรก็ตามใน. Net 4.5 / MVC 4 คุณสามารถเพิ่มการตรวจสอบความถูกต้องของที่อยู่อีเมลให้กับแบบฟอร์มได้โดยการเพิ่มคำอธิบายประกอบ [EmailAddress] จาก System.ComponentModel.DataAnnotations ดังนั้นฉันจึงสงสัยว่าทำไมฉันไม่สามารถใช้ฟังก์ชั่นในตัว โดยทั่วไปแล้วสุทธิ
ดูเหมือนว่าจะใช้งานได้และดูเหมือนว่าฉันจะสง่างามพอสมควร:
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
อนุญาตน้อยกว่าSystem.Net.Mail.MailAddress
ตัวอย่างเช่นMailAddress
ยอมรับที่อยู่สำหรับ TLD สิ่งที่คุณควรคำนึงถึงหากคุณจำเป็นต้องได้รับอนุญาตมากที่สุด
foo.IsValid(null);
true
ฉันใช้วิธีการซับเดี่ยวนี้ซึ่งใช้งานได้สำหรับฉัน -
using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
return new EmailAddressAttribute().IsValid(source);
}
ตามความคิดเห็นสิ่งนี้จะ "ล้มเหลว" หากsource
(ที่อยู่อีเมล) เป็นโมฆะ
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
ค่าสตริงว่าง นั่นเป็นเหตุผลที่ผมเสนอรุ่น (ดียิ่งขึ้นดีกว่า) public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
++: ตอนนี้ฉันจะไปและพบกับคริสตจักรปฏิรูปของผู้ทำเวอร์ชันที่ดียิ่งกว่า
.net 4.5 เพิ่ม System.ComponentModel.DataAnnotations.EmailAddressAttribute
คุณสามารถเรียกดูแหล่งที่มาของ EmailAddressAttributeนี่คือ Regex ที่ใช้ภายใน:
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
เพราะรูปแบบนี้ไม่อนุญาตให้ใช้ตัวพิมพ์ใหญ่อย่างชัดเจน!
ฉันรับคำตอบของฟิลจาก # 1 และสร้างคลาสนี้ เรียกว่าเป็นแบบนี้:bool isValid = Validator.EmailIsValid(emailString);
นี่คือคลาส:
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;
}
}
โดยส่วนตัวแล้วฉันจะบอกว่าคุณควรตรวจสอบให้แน่ใจว่ามีสัญลักษณ์ @ อยู่ในนั้น ตัวละคร มีหลาย regexes คุณสามารถใช้ความถูกต้องที่แตกต่างกัน แต่ฉันคิดว่าส่วนใหญ่เหล่านี้ออกจากที่อยู่อีเมลที่ถูกต้องหรือให้คนที่ไม่ถูกต้องผ่าน หากคนต้องการใส่ที่อยู่อีเมลปลอมพวกเขาจะใส่ที่อยู่อีเมลปลอม หากคุณต้องการตรวจสอบว่าที่อยู่อีเมลนั้นถูกต้องและบุคคลนั้นเป็นผู้ควบคุมที่อยู่อีเมลนั้นคุณจะต้องส่งอีเมลพร้อมลิงก์รหัสพิเศษให้พวกเขาเพื่อให้พวกเขาสามารถยืนยันได้ว่าเป็นที่อยู่จริงแน่นอน
ฉันคิดว่าวิธีที่ดีที่สุดคือ:
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;
}
คุณสามารถมีฟังก์ชั่นคงที่นี้ในชั้นเรียนทั่วไป
รหัสสั้นและแม่นยำ
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);
}
วิธีที่หรูหราที่สุดคือการใช้วิธีการของ. Net ในตัว
วิธีการเหล่านี้:
มีความพยายามและทดสอบ วิธีการเหล่านี้ใช้ในโครงการมืออาชีพของฉัน
ใช้นิพจน์ทั่วไปภายในซึ่งเชื่อถือได้และรวดเร็ว
ทำโดย Microsoft สำหรับ C # ไม่จำเป็นต้องบูรณาการล้อ
ส่งคืนผลลัพธ์บูล จริงหมายถึงอีเมลนั้นถูกต้อง
สำหรับผู้ใช้. Net 4.5 ขึ้นไป
เพิ่มการอ้างอิงนี้ไปยังโครงการของคุณ:
System.ComponentModel.DataAnnotations
ตอนนี้คุณสามารถใช้รหัสต่อไปนี้:
(new EmailAddressAttribute().IsValid("youremailhere@test.test"));
ตัวอย่างการใช้งาน
นี่คือวิธีการที่จะประกาศ:
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;
}
... และรหัสที่แสดงให้เห็นถึงการทำงาน:
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());
}
นอกจากนี้ตัวอย่างนี้:
;
โดยลำไส้ใหญ่กึ่งทางเลือกสำหรับผู้ใช้เวอร์ชัน. Net น้อยกว่า 4.5
สำหรับสถานการณ์ที่ไม่รองรับ. NET 4.5 ฉันใช้วิธีแก้ไขปัญหาต่อไปนี้:
โดยเฉพาะฉันใช้:
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;
}
ตามจริงแล้วในรหัสการผลิตสิ่งที่ดีที่สุดที่ฉันทำได้คือตรวจสอบ@
สัญลักษณ์
ฉันไม่เคยอยู่ในสถานที่ที่จะตรวจสอบอีเมลได้อย่างสมบูรณ์ คุณรู้ว่าฉันดูว่ามันถูกต้องจริงเหรอ? ถ้ามันถูกส่ง หากไม่เป็นเช่นนั้นก็ไม่ดีถ้าเป็นเช่นนั้นชีวิตก็ดี นั่นคือทั้งหมดที่ฉันต้องรู้
ฉันพบว่า regex นี้เป็นการแลกเปลี่ยนที่ดีระหว่างการตรวจสอบสิ่งที่มากกว่าเครื่องหมาย @ และยอมรับกรณีขอบแปลก ๆ :
^[^@\s]+@[^@\s]+(\.[^@\s]+)+$
อย่างน้อยมันจะทำให้คุณใส่เครื่องหมาย @ และวางอย่างน้อยก็เป็นโดเมนปกติ
bob@companyinternal
ไหม
การตรวจสอบที่อยู่อีเมลนั้นไม่ง่ายอย่างที่คิด จริงๆแล้วมันเป็นไปไม่ได้ในทางทฤษฎีที่จะตรวจสอบความถูกต้องของที่อยู่อีเมลโดยใช้การแสดงออกปกติ
ลองอ่านโพสต์บล็อกของฉันเกี่ยวกับเรื่องนี้เพื่อทำการสนทนาในหัวข้อและการนำ F # ไปใช้โดยใช้ FParsec [/ shameless_plug]
นี่คือคำตอบของฉัน - โซลูชันของ Phil ล้มเหลวสำหรับโดเมนจดหมายเดี่ยวเช่น "someone@q.com" เชื่อหรือไม่ว่ามันถูกใช้ =) (ไปที่ Centurylink เป็นต้น)
คำตอบของฟิลนั้นจะใช้งานได้เฉพาะกับมาตรฐาน PCRE เท่านั้น ... ดังนั้น C # จะเอาไปใช้ แต่จาวาสคริปต์ก็กำลังจะระเบิด ซับซ้อนเกินไปสำหรับจาวาสคริปต์ ดังนั้นคุณไม่สามารถใช้โซลูชันของ Phil สำหรับแอตทริบิวต์การตรวจสอบ mvc
นี่คือ regex ของฉัน มันจะทำงานได้ดีกับแอตทริบิวต์การตรวจสอบ MVC
- ทุกอย่างก่อนที่ @ จะทำให้ง่ายขึ้นดังนั้นอย่างน้อยจาวาสคริปต์ก็จะทำงานได้ ฉันโอเคที่จะใช้การตรวจสอบความผ่อนคลายที่นี่ตราบใดที่เซิร์ฟเวอร์การแลกเปลี่ยนไม่ได้ให้ 5.1.3 - ทุกอย่างหลังจากที่ @ เป็นคำตอบของ Phil แก้ไขสำหรับโดเมนจดหมายเดี่ยว
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]$";
สำหรับคนที่แนะนำให้ใช้ system.net.mail MailMessage () สิ่งนั้นจะเป็นวิธีที่ยืดหยุ่น แน่นอนว่า C # จะยอมรับอีเมล แต่จากนั้นเซิร์ฟเวอร์แลกเปลี่ยนจะระเบิดด้วยข้อผิดพลาด runtime 5.1.3 ทันทีที่คุณพยายามส่งอีเมล
basket@ball
ว่าเป็นที่อยู่อีเมลที่ถูกต้องได้รับคำตอบที่ถูกต้องเช่นเดียวกับ upvotes ทั้งหมด ขอขอบคุณ!
หากคุณและฉันหมายถึงต้องการทราบว่าที่อยู่อีเมลนั้นถูกต้องหรือไม่ ... ขอให้ผู้แลกเปลี่ยนอีเมลยืนยันว่าไม่จำเป็นต้องใช้ regex ฉันสามารถให้รหัสถ้ามีการร้องขอ
ขั้นตอนทั่วไปมีดังนี้: 1. ที่อยู่อีเมลมีชื่อโดเมนหรือไม่? (ดัชนีของ @> 0) 2. ใช้แบบสอบถาม DNS ถามว่าโดเมนมีตัวแลกเปลี่ยนอีเมลหรือไม่ 3. เปิดการเชื่อมต่อ tcp ไปยังตัวแลกเปลี่ยนจดหมาย 4. ใช้โปรโตคอล smtp เปิดข้อความไปยังเซิร์ฟเวอร์โดยใช้ที่อยู่อีเมลเป็นผู้รับ 5 แยกการตอบสนองของเซิร์ฟเวอร์ 6. ออกจากข้อความถ้าคุณทำมาไกลขนาดนี้ทุกอย่างดี
นี่คือคุณสามารถจินตนาการเวลาแพงมากและอาศัย smtp แต่ทำงานได้
โดยทั่วไปแล้วการแสดงออกในการตรวจสอบที่อยู่อีเมลไม่ใช่เรื่องง่ายที่จะเกิดขึ้น ในขณะที่เขียนนี้ไวยากรณ์ของที่อยู่อีเมลจะต้องเป็นไปตามมาตรฐานที่ค่อนข้างสูงและการดำเนินการทั้งหมดในการแสดงออกปกติไม่สามารถทำได้จริง!
ผมขอแนะนำให้คุณลองของเราEmailVerify.NETห้องสมุด .NET ผู้ใหญ่ซึ่งสามารถตรวจสอบที่อยู่อีเมลต่อไปนี้ทั้งหมดของ IETF มาตรฐานปัจจุบัน (RFC 1123, RFC 2821 RFC 2822, RFC 3696, RFC 4291, RFC 5321 และ RFC 5322) ทดสอบระเบียน DNS ที่เกี่ยวข้องตรวจสอบว่ากล่องจดหมายเป้าหมายสามารถรับข้อความได้หรือไม่และสามารถบอกได้ว่าที่อยู่ที่ระบุนั้นถูกทิ้งหรือไม่
คำเตือน: ฉันเป็นผู้พัฒนานำสำหรับส่วนนี้
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;
}
ในกรณีที่คุณใช้FluentValidationคุณสามารถเขียนบางอย่างได้ง่ายเช่นนี้
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;
การแก้ไขเล็กน้อยเพื่อตอบ @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);
เอาท์พุท "asdf @ asdf" ซึ่งไม่ถูกต้อง
มีคำตอบที่แข็งแกร่งมากมายที่นี่ อย่างไรก็ตามฉันขอแนะนำให้เราถอยกลับ @Cogwheel ตอบคำถามhttps://stackoverflow.com/a/1374644/388267 อย่างไรก็ตามอาจมีค่าใช้จ่ายในสถานการณ์การตรวจสอบความถูกต้องจำนวนมากหากที่อยู่อีเมลจำนวนมากที่ตรวจสอบความถูกต้องไม่ถูกต้อง ฉันขอแนะนำให้เราใช้ตรรกะสักเล็กน้อยก่อนที่เราจะเข้าไปในบล็อก try-catch ของเขา ฉันรู้ว่ารหัสต่อไปนี้สามารถเขียนได้โดยใช้ RegEx แต่อาจมีค่าใช้จ่ายสูงสำหรับนักพัฒนาใหม่ที่จะเข้าใจ นี่เป็นมูลค่าทวีตของฉัน:
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;
}
}
คำตอบที่ได้รับการโหวตมากที่สุดจาก @Cogwheel เป็นคำตอบที่ดีที่สุด แต่ฉันได้ลองใช้trim()
วิธีการแบบสตริงดังนั้นมันจะตัดพื้นที่สีขาวของผู้ใช้ทั้งหมดตั้งแต่ต้นจนจบ ตรวจสอบการร้องรหัสสำหรับตัวอย่างเต็ม -
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)
โดยใช้ผลลัพธ์ของวิธีนั้นเพื่อตรวจสอบความถูกต้องและส่งอีเมลไปที่
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);
}
ตรวจสอบว่าสายอักขระอีเมลเป็นรูปแบบที่ถูกต้องหรือรูปแบบที่ไม่ถูกต้องโดย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";
}
}
/ ใช้ Regex ภายในที่ใช้ในการสร้าง "ใหม่ EmailAddressAttribute ();" องค์ประกอบใน. Net4.5 >>> โดยใช้ System.ComponentModel.DataAnnotations; // เพื่อตรวจสอบที่อยู่อีเมล ...... ผ่านการทดสอบและใช้งานได้
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;
}
}
นอกจากนี้คุณสามารถใช้สิ่งนี้:
http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx
ฉันรวบรัดคำตอบของ Poyson 1 ดังนี้:
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);
}
วิธีง่ายๆในการระบุอีเมลนั้นถูกต้องหรือไม่
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})(\]?)$");
}
มีปัญหาวัฒนธรรมใน regex ใน C # แทนที่จะเป็น js ดังนั้นเราจำเป็นต้องใช้ regex ในโหมด US สำหรับการตรวจสอบอีเมล หากคุณไม่ได้ใช้โหมด ECMAScript อักขระพิเศษภาษาของคุณแปลเป็น AZ ด้วย 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)
ฉันลงเอยด้วยการใช้ regex นี้เพราะมันสามารถตรวจสอบคอมม่า, คอมเมนท์, ตัวอักษร Unicode และที่อยู่โดเมน IP (v4) ได้สำเร็จ
ที่อยู่ที่ถูกต้องจะเป็น:
"" @ example.org
(comment)test@example.org
тест@example.org
ტესტი @ example.org
ทดสอบ @ [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,}))$";
ง่าย ๆ โดยไม่ใช้ Regex (ซึ่งฉันไม่ชอบให้อ่านง่าย):
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;
}
ตัวอย่าง:
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
มันมีไว้เพื่อให้ง่ายและดังนั้นจึงไม่ได้จัดการกับกรณีที่หายากเช่นอีเมลที่มีโดเมนที่มีวงเล็บเหลี่ยมซึ่งมีช่องว่าง (โดยทั่วไปอนุญาต) อีเมลที่มีที่อยู่ IPv6 เป็นต้น
นี่คือคำตอบสำหรับคำถามของคุณเพื่อให้คุณตรวจสอบ
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;
}
}
จากคำตอบของ @Cogwheel ฉันต้องการแบ่งปันโซลูชันที่ปรับเปลี่ยนซึ่งใช้งานได้กับ SSIS และ "คอมโพเนนต์ของสคริปต์":
วางรหัสนี้ในวิธีการที่ถูกต้อง:
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";
}
}
จากนั้นคุณสามารถใช้การแบ่งตามเงื่อนไขเพื่อกรองระเบียนที่ไม่ถูกต้องทั้งหมดหรือสิ่งที่คุณต้องการทำ