[C#] 정규식 이메일 검증

나는 이것을 사용한다

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

정규식 이메일 확인

([\w\.\-]+)-이것은 첫 번째 수준 도메인 (다수의 문자와 숫자, 포인트와 하이픈)을

([\w\-]+)위한 것입니다-이것은 두 번째 수준의 도메인을위한 것입니다-이것은

((\.(\w){2,3})+)점과 2 또는 3을 포함하는 다른 수준의 도메인 (3에서 무한대까지)을위한 것입니다 리터럴

이 정규식에 어떤 문제가 있습니까?

편집 : ‘something@someth.ing ‘이메일과 일치하지 않습니다



답변

.museum 과 같은 TLD 는 이런 방식으로 일치하지 않으며, 다른 긴 TLD도 있습니다. 또한, 당신이 사용하는 이메일 주소를 확인할 수 MailAddress 클래스를 마이크로 소프트의 설명에 여기에 메모에서 :

정규식을 사용하여 전자 메일 주소의 유효성을 검사하는 대신 System.Net.Mail.MailAddress 클래스를 사용할 수 있습니다. 전자 메일 주소가 유효한지 확인하려면 전자 메일 주소를 MailAddress.MailAddress (String) 클래스 생성자에 전달하십시오.

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

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

이것은 정규식을 작성하거나 다른 사람의 이해를 시도 할 필요가 없기 때문에 많은 두통을 덜어줍니다.


답변

나는 @"^([\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. 길이가 3보다 큰 TLD를 사용합니다 (예 : .info


답변

사용하는 이메일 주소를 확인하는 표현이 있습니다.

위의 어느 것도 내만큼 짧거나 정확하지 않았으므로 여기에 게시 할 것이라고 생각했습니다.

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

자세한 내용은 여기를 참조하십시오 : C # – Email Regular Expression

또한 전자 메일이 실제로 존재하는지 여부가 아니라 전자 메일 구문을 기반으로 RFC 유효성을 검사합니다. 이메일이 실제로 존재하는지 테스트하는 유일한 방법은 링크를 클릭하거나 토큰을 입력하여 이메일을 보내고 이메일로 확인하고 이메일을 수신했는지 사용자에게 확인하는 것입니다.

그런 다음 Mailinator.com과 같은 폐기 도메인이 있습니다. 이메일이 폐기 도메인에서 온 것인지 아닌지를 확인하기 위해 아무 것도하지 않습니다.


답변

MSDN에서 멋진 문서를 찾았습니다.

방법 : 문자열이 유효한 전자 메일 형식인지

확인 http://msdn.microsoft.com/en-us/library/01escwtf.aspx (이 코드는 인터넷 도메인 이름에 ASCII가 아닌 문자 사용을 지원하는지 확인하십시오. )

.Net 2.0 / 3.0 및 .Net 3.5 이상에 대해 2 가지 구현이 있습니다.
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


답변

다음 코드는 github 에서 Microsoft의 데이터 주석 구현을 기반으로 하며 전자 메일에 대한 가장 완벽한 유효성 검사라고 생각합니다.

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);
}


답변

이는 RFC 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));
}


답변

최고의 이메일 검증 정규식

[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);