Проверка электронной почты Regex - PullRequest
191 голосов
/ 17 марта 2011

Я использую это

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

regexp для проверки электронной почты

([\w\.\-]+) - это для домена первого уровня (много букв и цифр, также точки и дефисы)

([\w\-]+) - это для домена второго уровня

((\.(\w){2,3})+) - и для доменов других уровней (от 3 до бесконечности), которые включают точку и 2 или 3 литерала

что не так с этим регулярным выражением?

РЕДАКТИРОВАТЬ: оно не совпадает с "Some@someth.ing" электронной почты

Ответы [ 30 ]

328 голосов
/ 17 марта 2011

TLD, такие как .museum , не сопоставляются таким образом, и есть несколько других длинных TLD.Кроме того, вы можете проверять адреса электронной почты, используя MailAddress class , как 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;
    }
}

Это избавит вас от головной боли, поскольку вам не нужнонаписать (или попытаться понять чужое) регулярное выражение.

89 голосов
/ 24 марта 2012

Я думаю @"^([\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, например .info

62 голосов
/ 01 августа 2011

У меня есть выражение для проверки адресов электронной почты, которые я использую.

Поскольку ни один из вышеперечисленных документов не был настолько коротким и точным, как мой, я подумал, что опубликую его здесь.

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

Для получения дополнительной информации читайте об этом здесь: C # - Регулярное выражение электронной почты

Кроме того, это проверяет достоверность RFC на основе синтаксиса электронной почты, а не на наличие электронной почты.Единственный способ проверить, что электронная почта действительно существует, - это отправить и отправить электронное письмо, а пользователь должен подтвердить, что он получил электронную почту, щелкнув ссылку или введя токен.

Затем существуют одноразовые домены, такие как Mailinator.и тому подобное.Это ничего не делает для проверки, является ли электронная почта от одноразового домена или нет.

34 голосов
/ 04 декабря 2012

Я нашел хороший документ для MSDN для него.

Как: проверить, что строки имеют допустимый формат электронной почты http://msdn.microsoft.com/en-us/library/01escwtf.aspx (проверьте, что этот код также поддерживает использование не-ASCII символовдля доменных имен в Интернете.)

Существует две реализации: для .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
9 голосов
/ 08 ноября 2012

Это не соответствует всем требованиям 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));
}
8 голосов
/ 19 июля 2017

Следующий код основан на Реализации аннотаций данных 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);
}
7 голосов
/ 14 октября 2016

Лучшее регулярное выражение проверки электронной почты

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

6 голосов
/ 17 марта 2011

Примерьте размер:

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 голосов
/ 23 июля 2012

Попробуйте, у меня все работает:

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(".");
    }
}
4 голосов
/ 25 апреля 2016

Почему бы не использовать проверку электронной почты на основе атрибутов EF6?

Как вы можете видеть выше, проверка Regex для электронной почты всегда имеет какую-то дыру. Если вы используете аннотации данных EF6, вы можете легко добиться надежной и надежной проверки электронной почты с помощью атрибута аннотации данных EmailAddress . Мне пришлось удалить проверку регулярного выражения, которую я использовал ранее для электронной почты, когда я получил сообщение о сбое регулярного выражения для мобильного устройства в поле ввода электронной почты. Когда атрибут аннотации данных использовался для проверки электронной почты, проблема на мобильном телефоне была решена.

public class LoginViewModel
{
    [EmailAddress(ErrorMessage = "The email format is not valid")]
    public string Email{ get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...