การตรวจสอบอีเมล Regex


215

ฉันใช้สิ่งนี้

@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$"

regexp เพื่อตรวจสอบอีเมล

([\w\.\-]+)- สิ่งนี้มีไว้สำหรับโดเมนระดับแรก (ตัวอักษรและตัวเลขจำนวนมากรวมถึงจุดและยัติภังค์)

([\w\-]+)- สำหรับโดเมนระดับที่สอง

((\.(\w){2,3})+)- และสำหรับโดเมนระดับอื่น (จาก 3 ถึงอินฟินิตี้) ซึ่งรวมถึงจุดและ 2 หรือ 3 ตัวอักษร

เกิดอะไรขึ้นกับ regex นี้

แก้ไข: มันไม่ตรงกับอีเมล "something@someth.ing"


1
นอกเหนือจากที่คุณไม่ได้รวมอักขระที่ถูกต้องตามที่ระบุโดย RFCs 5321 & 5322 -ไม่มี
แบรดคริสตี้


ฉันคิดว่าคุณต้องบอกเราว่ามีอะไรผิดปกติและคนอื่น ๆ ที่นี่สามารถช่วยคุณแก้ไขสิ่งที่ผิด
Uwe Keim

10
คุณมีปัญหา -> คุณคิดว่า 'regex' -> ตอนนี้คุณมี 2 ปัญหา ;-)
Jakub Konecki

1
เพียงความคิดเห็นเกี่ยวกับ regex ของคุณ ด้วย .amsterdam, .info และโดเมนอื่น ๆ เหล่านี้ regex ควรเป็น:@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,})+)$""
Ton Snoei

คำตอบ:


372

พิพิธภัณฑ์ที่เหมือนกันของ TLD ไม่ตรงกับวิธีนี้และมี TLD ยาว ๆ อีกสองสามตัว นอกจากนี้คุณสามารถตรวจสอบความถูกต้องของที่อยู่อีเมลโดยใช้คลาส MailAddressดังที่ Microsoft อธิบายไว้ที่นี่ในหมายเหตุ:

แทนที่จะใช้นิพจน์ทั่วไปเพื่อตรวจสอบที่อยู่อีเมลคุณสามารถใช้คลาส System.Net.Mail.MailAddress เพื่อตรวจสอบว่าที่อยู่อีเมลที่ถูกต้องผ่านที่อยู่อีเมลไปยังตัวสร้างคลาส MailAddress.MailAddress (String)

public bool IsValid(string emailaddress)
{
    try
    {
        MailAddress m = new MailAddress(emailaddress);

        return true;
    }
    catch (FormatException)
    {
        return false;
    }
}

การทำเช่นนี้ช่วยให้คุณปวดหัวมากเพราะคุณไม่ต้องเขียน (หรือพยายามที่จะเข้าใจ regex ของคนอื่น)


63
สิ่งนี้ไม่ได้รับจุดสองจุด ".. " หรือที่ว่างแบบอินไลน์ "." ฉันจะไปกับ regex แทน
Benny Skogberg

33
อย่างไรก็ตามเรื่องนี้เป็นคำตอบที่ได้รับความนิยม ไม่ถูกต้องล้มเหลวในการตรวจสอบรูปแบบที่ไม่ถูกต้องอย่างน้อยสองรูปแบบ: "Abc. @ example.com", "Abc..123 @ example.com"
sean717

12
@ sean717: ดู RFC และ / หรือการเชื่อมโยง ฉันยอมรับว่าตัวอย่างของคุณอาจไม่ทำงานในโลกแห่งความเป็นจริง แต่นั่นก็ไม่ได้ทำให้พวกเขาไม่ถูกต้อง
Dan Pichelman

13
ไม่ว่าจะใช้งานได้หรือไม่ใช้ลอง catch เพื่อตรวจสอบอินพุตไม่แนะนำให้ฝึกฝน Regex เป็นวิธีที่ดีกว่าที่จะไปแน่นอน
mrt

159
-1 โค้ดไม่ดี การจับข้อยกเว้นไม่ใช่วิธีการตรวจสอบความถูกต้องของเขตข้อมูล
ken2k

99

ฉันคิดว่า@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$"ควรจะทำงาน
คุณต้องเขียนเหมือน

string email = txtemail.Text;
Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
Match match = regex.Match(email);
if (match.Success)
    Response.Write(email + " is correct");
else
    Response.Write(email + " is incorrect");

ได้รับการเตือนว่าสิ่งนี้จะล้มเหลวหาก:

  1. มีโดเมนย่อยหลัง@สัญลักษณ์

  2. คุณใช้ TLD ที่มีความยาวมากกว่า 3 เช่น .info


2
ส่งคืน test@-online.com ว่าถูกต้อง ควรจะไม่ถูกต้อง
งัด F

7
ฉันเชื่อว่าสิ่งนี้จะล้มเหลวใน TLD ใหม่ที่กำลังออกเนื่องจากคุณสามารถมี TLD ได้มากกว่า 3 ตัวอักษรในขณะนี้
AaronLS

regex นี้อนุญาตให้ "somename@gmail.com.in.in.in.in" ถูกต้อง
อยากรู้อยากเห็น

14
gmail.com.in.in.in เป็นชื่อโดเมนที่ถูกต้องสมบูรณ์แบบดังนั้นฉันจึงไม่เห็นสาเหตุที่ไม่อนุญาต
larsw

เห็นด้วยกับ @larsw ไม่ควรใช้ regex
Boris Sokolov

68

ฉันมีการแสดงออกในการตรวจสอบที่อยู่อีเมลที่ฉันใช้

เนื่องจากข้อใดข้อหนึ่งข้างต้นสั้นหรือแม่นยำเท่ากับของฉันฉันคิดว่าฉันจะโพสต์ไว้ที่นี่

@"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
+ "@"
+ @"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$";

อ่านข้อมูลเพิ่มเติมได้ที่นี่: C # - อีเมลนิพจน์ปกติ

นอกจากนี้จะตรวจสอบความถูกต้อง RFC ตามไวยากรณ์ของอีเมลไม่ใช่ว่าอีเมลนั้นมีอยู่จริงหรือไม่ วิธีเดียวที่จะทดสอบว่าอีเมลมีอยู่จริงคือการส่งและส่งอีเมลและให้ผู้ใช้ยืนยันว่าพวกเขาได้รับอีเมลโดยคลิกที่ลิงก์หรือป้อนโทเค็น

จากนั้นมีโดเมนที่ใช้แล้วทิ้งเช่น Mailinator.com และอื่น ๆ สิ่งนี้ไม่ได้ทำอะไรเพื่อยืนยันว่าอีเมลนั้นมาจากโดเมนที่อนุญาตหรือไม่


นั่นคือสิ่งที่ฉันกำลังมองหา - ขอบคุณ! ใช้ทั้งจุดสองจุด ".. " และช่องว่างสีขาว "."
Benny Skogberg

5
ฉันปรับปรุงโครงการการแสดงออกของฉันปกติที่จะมีการทดสอบหน่วยและฉันยังคงคู่ของข้อบกพร่อง: C # - อีเมลนิพจน์rhyous.com/2010/06/15/csharp-email-regular-expression
Rhyous

ด้วย TLD ใหม่เราอาจจะแทนที่ [a-zA-Z] {2,4} ในบรรทัดที่สามด้วย {0} จากนั้นทำ string.format (รูปแบบ, pipeSeparatedAllowedTlds) โดยที่ pipeSeparatedAllowedTlds จะต้องถูกสร้างขึ้นโดย ทำซ้ำผ่านไฟล์นี้: data.iana.org/TLD/tlds-alpha-by-domain.txt
Rhyous

12
Parth คุณช่วยบอกฉันหน่อยได้ไหมว่ากฎ RFC ใช้งานไม่ได้ในอีเมล เพราะเดาอะไร ตาม RFC มันถูกต้อง !!!! หากคุณซื้อ URL ในคุณสามารถสร้างที่อยู่อีเมลนี้ได้ เข้าใจ?
Rhyous

2
ที่จริงมันดูเหมือนว่าฉันปรับปรุงแล้วว่าบน GitHub ของฉันที่นี่: github.com/rhyous/EmailRegEx อย่างไรก็ตาม \ w อาจรวมถึงขีดล่างดังนั้นฉันอาจต้องแก้ไขเพื่อความถูกต้อง
Rhyous

36

ฉันพบเอกสารที่ดีใน MSDN สำหรับมัน

วิธีการ: ตรวจสอบว่าสตริงอยู่ในรูปแบบอีเมลที่ถูกต้อง http://msdn.microsoft.com/en-us/library/01escwtf.aspx (ตรวจสอบว่ารหัสนี้รองรับการใช้อักขระที่ไม่ใช่ ASCII สำหรับชื่อโดเมนอินเทอร์เน็ต )

มีการนำไปปฏิบัติ 2 แบบสำหรับ. Net 2.0 / 3.0 และ. Net 3.5 และสูงกว่า
รุ่น 2.0 / 3.0 คือ:

bool IsValidEmail(string strIn)
{
    // Return true if strIn is in valid e-mail format.
    return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); 
}

การทดสอบของฉันกับวิธีนี้ให้:

Invalid: @majjf.com
Invalid: A@b@c@example.com
Invalid: Abc.example.com
Valid: j..s@proseware.com
Valid: j.@server1.proseware.com
Invalid: js*@proseware.com
Invalid: js@proseware..com
Valid: ma...ma@jjf.co
Valid: ma.@jjf.com
Invalid: ma@@jjf.com
Invalid: ma@jjf.
Invalid: ma@jjf..com
Invalid: ma@jjf.c
Invalid: ma_@jjf
Invalid: ma_@jjf.
Valid: ma_@jjf.com
Invalid: -------
Valid: 12@hostname.com
Valid: d.j@server1.proseware.com
Valid: david.jones@proseware.com
Valid: j.s@server1.proseware.com
Invalid: j@proseware.com9
Valid: j_9@[129.126.118.1]
Valid: jones@ms1.proseware.com
Invalid: js#internal@proseware.com
Invalid: js@proseware.com9
Invalid: js@proseware.com9
Valid: m.a@hostname.co
Valid: m_a1a@hostname.com
Valid: ma.h.saraf.onemore@hostname.com.edu
Valid: ma@hostname.com
Invalid: ma@hostname.comcom
Invalid: MA@hostname.coMCom
Valid: ma12@hostname.com
Valid: ma-a.aa@hostname.com.edu
Valid: ma-a@hostname.com
Valid: ma-a@hostname.com.edu
Valid: ma-a@1hostname.com
Valid: ma.a@1hostname.com
Valid: ma@1hostname.com

1
ไม่ตรงกับ[me]@whatever.museum
โตโต้

ไม่ถูกต้อง: Abc.example.com YES ที่ทำงานได้อย่างถูกต้องอย่างไรก็ตาม "toms.email. @ gmail.com"; ไม่ทำงาน
Tom Stickel

1
ต้องเพิ่มเครื่องหมายบวก: `@" ^ ([\ w - \. +] +) @ (([[0-9] {1,3} \. [0-9] {1,3} \ [0-9] {1,3} \) |. (. ([w \ -] + \) +)) ([a-zA-Z] {2,4} | [0-9] {1, 3}) (]?) $ "` 11 ถ่านที่เหลืออยู่บน] Google และชื่อแทนการส่งข้อความ Hotmail อนุญาตให้ลงชื่อเข้าใช้ในส่วนแรกก่อน @ ลงชื่อ
Henk J Meulekamp

นี่เป็นเช่นเดียวกับข้างต้น อนุญาตให้ "somename@gmail.com.in.in" เป็นที่อยู่อีเมลที่ถูกต้อง ... !!
อยากรู้อยากเห็น

9
@ParthTrivedi ทำไมคุณถึงยืนยันว่าsomename@gmail.com.in.in.inไม่ใช่ที่อยู่อีเมลที่ถูกต้อง
Ivaylo Slavov

15

รหัสต่อไปนี้เป็นไปตามการใช้คำอธิบายประกอบข้อมูลของ Microsoft ใน gitHubและฉันคิดว่ามันเป็นการตรวจสอบที่สมบูรณ์แบบที่สุดสำหรับอีเมล:

public static Regex EmailValidation()
{
    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])))\.?$";
    const RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture;

    // Set explicit regex match timeout, sufficient enough for email parsing
    // Unless the global REGEX_DEFAULT_MATCH_TIMEOUT is already set
    TimeSpan matchTimeout = TimeSpan.FromSeconds(2);

    try
    {
        if (AppDomain.CurrentDomain.GetData("REGEX_DEFAULT_MATCH_TIMEOUT") == null)
        {
            return new Regex(pattern, options, matchTimeout);
        }
    }
    catch
    {
        // Fallback on error
    }

    // Legacy fallback (without explicit match timeout)
    return new Regex(pattern, options);
}

1
ยินดีที่ได้รับสิ่งนี้จากแหล่งข้อมูลระดับมืออาชีพ ชื่นชม
Nicholas Petersen

1
นี่ควรเป็น regex ที่ดีที่สุดเพราะดูเหมือนว่าจะตรวจสอบ RFCs 5321 และ 5322 มันพลาดการทดสอบหน่วย
ToXinE

ห้ามจับจุดที่ส่วนท้ายของที่อยู่อีเมล
Sellorio

12

สิ่งนี้ไม่เป็นไปตามข้อกำหนดทั้งหมดของ RFCs 5321 และ 5322 แต่ใช้ได้กับคำจำกัดความต่อไปนี้

@"^([0-9a-zA-Z]([\+\-_\.][0-9a-zA-Z]+)*)+"@(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,17})$";

ด้านล่างเป็นรหัส

const String pattern =
   @"^([0-9a-zA-Z]" + //Start with a digit or alphabetical
   @"([\+\-_\.][0-9a-zA-Z]+)*" + // No continuous or ending +-_. chars in email
   @")+" +
   @"@(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,17})$";

var validEmails = new[] {
        "ma@hostname.com",
        "ma@hostname.comcom",
        "MA@hostname.coMCom",
        "m.a@hostname.co",
        "m_a1a@hostname.com",
        "ma-a@hostname.com",
        "ma-a@hostname.com.edu",
        "ma-a.aa@hostname.com.edu",
        "ma.h.saraf.onemore@hostname.com.edu",
        "ma12@hostname.com",
        "12@hostname.com",
};
var invalidEmails = new[] {
        "Abc.example.com",     // No `@`
        "A@b@c@example.com",   // multiple `@`
        "ma...ma@jjf.co",      // continuous multiple dots in name
        "ma@jjf.c",            // only 1 char in extension
        "ma@jjf..com",         // continuous multiple dots in domain
        "ma@@jjf.com",         // continuous multiple `@`
        "@majjf.com",          // nothing before `@`
        "ma.@jjf.com",         // nothing after `.`
        "ma_@jjf.com",         // nothing after `_`
        "ma_@jjf",             // no domain extension 
        "ma_@jjf.",            // nothing after `_` and .
        "ma@jjf.",             // nothing after `.`
    };

foreach (var str in validEmails)
{
    Console.WriteLine("{0} - {1} ", str, Regex.IsMatch(str, pattern));
}
foreach (var str in invalidEmails)
{
    Console.WriteLine("{0} - {1} ", str, Regex.IsMatch(str, pattern));
}

1
นิพจน์นี้ไม่ตรงกับที่อยู่ที่ถูกต้อง!#$%&'*+-/=?^_{|} ~ @ example.com` หรืออันนี้Dörte@Sörensen.example.com
TS

7

regex การตรวจสอบอีเมลที่ดีที่สุด

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

และมันคือการใช้งาน: -

bool isEmail = Regex.IsMatch(emailString, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);

6

ลองใช้ขนาดนี้ดู:

public static bool IsValidEmailAddress(this string s)
{
    var regex = new Regex(@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");
    return regex.IsMatch(s);
}

5

ลองสิ่งนี้มันใช้งานได้สำหรับฉัน:

public bool IsValidEmailAddress(string s)
{
    if (string.IsNullOrEmpty(s))
        return false;
    else
    {
        var regex = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
        return regex.IsMatch(s) && !s.EndsWith(".");
    }
}

5

regex นี้ทำงานได้อย่างสมบูรณ์แบบ:

bool IsValidEmail(string email)
{
    return Regex.IsMatch(email, @"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))\z");
}

4

อีเมลนี้ป้องกันอีเมลที่ไม่ถูกต้องที่ผู้อื่นกล่าวถึงในความคิดเห็น:

Abc.@example.com
Abc..123@example.com
name@hotmail
toms.email.@gmail.com
test@-online.com

นอกจากนี้ยังป้องกันอีเมลที่มีจุดสองจุด:

hello..world@example..com

ลองทดสอบด้วยที่อยู่อีเมลที่ไม่ถูกต้องมากที่สุดเท่าที่จะหาได้

using System.Text.RegularExpressions;

public static bool IsValidEmail(string email)
{
    return Regex.IsMatch(email, @"\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,4}\z")
        && Regex.IsMatch(email, @"^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*");
}

ดูที่อยู่อีเมลตรวจสอบโดยใช้การแสดงออกปกติใน C #


สิ่งนี้จะส่งกลับค่าเท็จสำหรับที่อยู่อีเมลที่ไม่ถูกต้องทั้งหมดของฉัน น่าเสียดายที่ส่งคืนค่าเท็จสำหรับที่อยู่อีเมลที่ถูกต้องจำนวนมาก
Mark

4

ทำไมไม่ใช้การตรวจสอบอีเมลตามคุณสมบัติของ EF6

ดังที่คุณเห็นด้านบนการตรวจสอบ Regex สำหรับอีเมลจะมีช่องโหว่อยู่เสมอ หากคุณกำลังใช้คำอธิบายประกอบข้อมูล EF6 คุณสามารถบรรลุการตรวจสอบอีเมลที่เชื่อถือได้และแข็งแกร่งยิ่งขึ้นด้วยแอตทริบิวต์คำอธิบายประกอบข้อมูลEmailAddress ฉันต้องลบการตรวจสอบความถูกต้องของ regex ที่ฉันใช้ก่อนหน้าสำหรับอีเมลเมื่อฉันได้รับความผิดพลาด regex ของอุปกรณ์มือถือในช่องป้อนข้อมูลอีเมล เมื่อแอตทริบิวต์ข้อมูลกำกับที่ใช้สำหรับการตรวจสอบความถูกต้องของอีเมลปัญหาในมือถือได้รับการแก้ไข

public class LoginViewModel
{
    [EmailAddress(ErrorMessage = "The email format is not valid")]
    public string Email{ get; set; }


1
public static bool ValidateEmail(string str)
{                       
     return Regex.IsMatch(str, @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
}

ฉันใช้รหัสด้านบนเพื่อตรวจสอบที่อยู่อีเมล


1
   public bool VailidateEntriesForAccount()
    {
       if (!(txtMailId.Text.Trim() == string.Empty))
        {
            if (!IsEmail(txtMailId.Text))
            {
                Logger.Debug("Entered invalid Email ID's");
                MessageBox.Show("Please enter valid Email Id's" );
                txtMailId.Focus();
                return false;
            }
        }
     }
   private bool IsEmail(string strEmail)
    {
        Regex validateEmail = new Regex("^[\\W]*([\\w+\\-.%]+@[\\w\\-.]+\\.[A-Za-z] {2,4}[\\W]*,{1}[\\W]*)*([\\w+\\-.%]+@[\\w\\-.]+\\.[A-Za-z]{2,4})[\\W]*$");
        return validateEmail.IsMatch(strEmail);
    }

ในขณะที่รหัสนี้อาจตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการที่รหัสนี้ตอบคำถามช่วยเพิ่มมูลค่าระยะยาว
AStopher


1

มีความพยายามหลายครั้งในการสร้างตัวตรวจสอบความถูกต้องของอีเมลซึ่งสามารถตรวจจับความต้องการอีเมลทั่วโลกได้เกือบทั้งหมด

วิธีการขยายที่คุณสามารถโทรได้ด้วย:

myEmailString.IsValidEmailAddress();

สตริงรูปแบบ Regex คุณสามารถรับได้โดยโทร:

var myPattern = Regex.EmailPattern;

รหัส (ความคิดเห็นส่วนใหญ่):

    /// <summary>
    /// Validates the string is an Email Address...
    /// </summary>
    /// <param name="emailAddress"></param>
    /// <returns>bool</returns>
    public static bool IsValidEmailAddress(this string emailAddress)
    {
        var valid = true;
        var isnotblank = false;

        var email = emailAddress.Trim();
        if (email.Length > 0)
        {
            // Email Address Cannot start with period.
            // Name portion must be at least one character
            // In the Name, valid characters are:  a-z 0-9 ! # _ % & ' " = ` { } ~ - + * ? ^ | / $
            // Cannot have period immediately before @ sign.
            // Cannot have two @ symbols
            // In the domain, valid characters are: a-z 0-9 - .
            // Domain cannot start with a period or dash
            // Domain name must be 2 characters.. not more than 256 characters
            // Domain cannot end with a period or dash.
            // Domain must contain a period
            isnotblank = true;
            valid = Regex.IsMatch(email, Regex.EmailPattern, RegexOptions.IgnoreCase) &&
                !email.StartsWith("-") &&
                !email.StartsWith(".") &&
                !email.EndsWith(".") && 
                !email.Contains("..") &&
                !email.Contains(".@") &&
                !email.Contains("@.");
        }

        return (valid && isnotblank);
    }

    /// <summary>
    /// Validates the string is an Email Address or a delimited string of email addresses...
    /// </summary>
    /// <param name="emailAddress"></param>
    /// <returns>bool</returns>
    public static bool IsValidEmailAddressDelimitedList(this string emailAddress, char delimiter = ';')
    {
        var valid = true;
        var isnotblank = false;

        string[] emails = emailAddress.Split(delimiter);

        foreach (string e in emails)
        {
            var email = e.Trim();
            if (email.Length > 0 && valid) // if valid == false, no reason to continue checking
            {
                isnotblank = true;
                if (!email.IsValidEmailAddress())
                {
                    valid = false;
                }
            }
        }
        return (valid && isnotblank);
    }

    public class Regex
    {
        /// <summary>
        /// Set of Unicode Characters currently supported in the application for email, etc.
        /// </summary>
        public static readonly string UnicodeCharacters = "À-ÿ\p{L}\p{M}ÀàÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü«»€₣äÄöÖüÜß"; // German and French

        /// <summary>
        /// Set of Symbol Characters currently supported in the application for email, etc.
        /// Needed if a client side validator is being used.
        /// Not needed if validation is done server side.
        /// The difference is due to subtle differences in Regex engines.
        /// </summary>
        public static readonly string SymbolCharacters = @"!#%&'""=`{}~\.\-\+\*\?\^\|\/\$";

        /// <summary>
        /// Regular Expression string pattern used to match an email address.
        /// The following characters will be supported anywhere in the email address:
        /// ÀàÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü«»€₣äÄöÖüÜß[a - z][A - Z][0 - 9] _
        /// The following symbols will be supported in the first part of the email address(before the @ symbol):
        /// !#%&'"=`{}~.-+*?^|\/$
        /// Emails cannot start or end with periods,dashes or @.
        /// Emails cannot have two @ symbols.
        /// Emails must have an @ symbol followed later by a period.
        /// Emails cannot have a period before or after the @ symbol.
        /// </summary>
        public static readonly string EmailPattern = String.Format(
            @"^([\w{0}{2}])+@{1}[\w{0}]+([-.][\w{0}]+)*\.[\w{0}]+([-.][\w{0}]+)*$",                     //  @"^[{0}\w]+([-+.'][{0}\w]+)*@[{0}\w]+([-.][{0}\w]+)*\.[{0}\w]+([-.][{0}\w]+)*$",
            UnicodeCharacters,
            "{1}",
            SymbolCharacters
        );
    }

1

ในการตรวจสอบรหัสอีเมลของคุณคุณสามารถสร้างวิธีดังกล่าวและใช้งานได้

    public static bool IsValidEmail(string email)
    {
        var r = new Regex(@"^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$");
        return !String.IsNullOrEmpty(email) && r.IsMatch(email);
    }

สิ่งนี้จะส่งคืนจริง / เท็จ (รหัสอีเมลที่ถูกต้อง / ไม่ถูกต้อง)


1

นี่เป็นวิธีที่ฉันโปรดปรานในตอนนี้:

public static class CommonExtensions
{
    public static bool IsValidEmail(this string thisEmail)
        => !string.IsNullOrWhiteSpace(thisEmail) &&
           new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$").IsMatch(thisEmail);
}

จากนั้นใช้ส่วนขยายสตริงที่สร้างขึ้นเช่น:

if (!emailAsString.IsValidEmail()) throw new Exception("Invalid Email");

1

เพียงแจ้งให้เราทราบหากไม่ได้ผล :)

public static bool isValidEmail(this string email)
{

    string[] mail = email.Split(new string[] { "@" }, StringSplitOptions.None);

    if (mail.Length != 2)
        return false;

    //check part before ...@

    if (mail[0].Length < 1)
        return false;

    System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z0-9_\-\.]+$");
    if (!regex.IsMatch(mail[0]))
        return false;

    //check part after @...

    string[] domain = mail[1].Split(new string[] { "." }, StringSplitOptions.None);

    if (domain.Length < 2)
        return false;

    regex = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z0-9_\-]+$");

    foreach (string d in domain)
    {
        if (!regex.IsMatch(d))
            return false;
    }

    //get TLD
    if (domain[domain.Length - 1].Length < 2)
        return false;

    return true;

}

1

นี่คือ Regex ของเราสำหรับกรณีนี้:

@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                       @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                       @".)+))([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$",

มีสามส่วนซึ่งถูกตรวจสอบ อันสุดท้ายคือความสามารถที่คุณต้องการ คำเฉพาะ{2,6}หมายถึงคุณมีความยาวต่ำสุด / สูงสุดของ TLD ในตอนท้าย HTH


0

ลองรหัสต่อไปนี้:

using System.Text.RegularExpressions;
if  (!Regex.IsMatch(txtEmail.Text, @"^[a-z,A-Z]{1,10}((-|.)\w+)*@\w+.\w{3}$"))
        MessageBox.Show("Not valid email.");

0

การค้นหา STRING โดยใช้วิธี REGEX ใน C #

วิธีการตรวจสอบอีเมลโดยการแสดงออกปกติ?

string EmailPattern = @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
if (Regex.IsMatch(Email, EmailPattern, RegexOptions.IgnoreCase))
{
    Console.WriteLine("Email: {0} is valid.", Email);
}
else
{
    Console.WriteLine("Email: {0} is not valid.", Email);
}

ใช้การอ้างอิงString.Regex () วิธีการ


0

1

^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$

2

^(([^<>()[\]\\.,;:\s@\""]+(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@((\[[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,}))$

0

ฉันคิดว่าเครื่องหมายคาเร็ตและเครื่องหมายดอลลาร์ของคุณเป็นส่วนหนึ่งของปัญหาคุณควรแก้ไข regex นิดหน่อยฉันใช้ @ @ [:] + ([\ w .-] +) @ ([\ w -.]) + ((. (w \) {2,3}) +)"


เมื่อคุณใช้ Trim ผลลัพธ์ (':')
ABMoharram

0

รูปแบบอีเมล Regex:

^(?:[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+\\.)*[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!\\.)){0,61}[a-zA-Z0-9]?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\\[(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\]))$

0

ฉันใช้ Regex.IsMatch () แล้ว

ก่อนอื่นคุณต้องเพิ่มคำสั่งถัดไป:

using System.Text.RegularExpressions;

จากนั้นวิธีการดูเหมือน:

private bool EmailValidation(string pEmail)
{
                 return Regex.IsMatch(pEmail,
                 @"^(?("")("".+?(?<!\\)""@)|(([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));
}

มันเป็นวิธีการส่วนตัวเนื่องจากตรรกะของฉัน แต่คุณสามารถวางวิธีการเป็นแบบคงที่ในเลเยอร์อื่นเช่น "ยูทิลิตี้" และเรียกมันจากที่ที่คุณต้องการ


0

ไม่มีการแสดงออกปกติที่สมบูรณ์แบบเป็น แต่คนนี้สวยแข็งแรงผมคิดว่าขึ้นอยู่กับการศึกษาของRFC5322 และด้วยการแก้ไขสตริง C # นั้นค่อนข้างง่ายที่จะติดตามฉันคิดเช่นกัน

const string atext = @"a-zA-Z\d!#\$%&'\*\+-/=\?\^_`\{\|\}~";
var localPart = $"[{atext}]+(\\.[{atext}]+)*";
var domain = $"[{atext}]+(\\.[{atext}]+)*";
Assert.That(() => EmailRegex = new Regex($"^{localPart}@{domain}$", Compiled), 
Throws.Nothing);

NUnit 2.xการตรวจสอบด้วย


0

ฉันได้สร้างคลาส FormValidationUtils เพื่อตรวจสอบอีเมล:

public static class FormValidationUtils
{
    const string ValidEmailAddressPattern = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$";

    public static bool IsEmailValid(string email)
    {
        var regex = new Regex(ValidEmailAddressPattern, RegexOptions.IgnoreCase);
        return regex.IsMatch(email);
    }
}

0

การตรวจสอบอีเมลโดยใช้ regex

    string pattern = @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";

    //check first string
   if (Regex.IsMatch(EmailId1 , pattern))
   {    
       //if email is valid
        Console.WriteLine(EmailId1+ " is a valid Email address ");
   }

ที่มา: การตรวจสอบอีเมล c #

การตรวจสอบความถูกต้องโดยไม่ใช้ Regex โดยใช้ตัวสร้างคลาสMailAddress.MailAddress (String)

public bool IsEmailValid(string emailaddress)
{
 try
 {
    MailAddress m = new MailAddress(emailaddress);
    return true;
 }
 catch (FormatException)
 {
    return false;
 }
}

me@localhostนี้จะไม่ตรงกับ โปรดดูที่เว็บไซต์เหล่านี้: รายการ TLD ; ที่อยู่ที่ถูกต้อง / ไม่ถูกต้อง ; regex สำหรับที่อยู่อีเมล RFC822
โตโต้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.