Подтвердить что ты не робот

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

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

Лучшее, что я нашел, это

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

Есть ли что-то лучше?

4b9b3361

Ответ 1

Адрес электронной почты: Формат RFC 2822
Соответствует нормальному адресу электронной почты. Не проверяет домен верхнего уровня.
Требуется "нечувствительность к регистру", вариант будет включен.

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

Ответ 3

Эта функция С# использует регулярное выражение для оценки синтаксически допустимого адреса электронной почты.

public static bool isValidEmail(string inputEmail)
{
   string strRegex = @"^([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})(\]?)$";
   Regex re = new Regex(strRegex);
   if (re.IsMatch(inputEmail))
    return (true);
   else
    return (false);
}

Ответ 4

Обновлен ответ на 2019 год.

Regex объект является поточно-ориентированным для функций соответствия. Зная, что есть некоторые варианты производительности или проблемы с культурой/языком, я предлагаю это простое решение.

public static Regex _regex = new 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,4}|[0-9]{1,3})(\]?)$",
    RegexOptions.CultureInvariant | RegexOptions.Singleline);

public static bool IsValidEmailFormat(string emailInput)
{
    return _regex.IsMatch(emailInput);
}

Альтернативная конфигурация для Regex:

public static Regex _regex = new 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,4}|[0-9]{1,3})(\]?)$",
    RegexOptions.CultureInvariant | RegexOptions.Compiled);

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

Поток безопасности и регулярное выражение
Regex Best Practices

Ответ 6

Я хотел бы предложить new EmailAddressAttribute().IsValid(emailTxt) для дополнительной проверки до/после проверки с использованием RegEx

Помните, что EmailAddressAttribute является частью System.ComponentModel.DataAnnotations namespace.