Лучшее регулярное выражение для проверки электронной почты в С#
Я видел множество регулярных выражений для разных языков программирования, все из которых предназначены для проверки адресов электронной почты. Я видел много комментариев, говорящих, что рассматриваемые выражения не работают в определенных случаях и что они либо слишком строги, либо слишком разрешительны. Я ищу регулярное выражение, которое я могу использовать в моем коде С#, который является окончательным.
Лучшее, что я нашел, это
^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$
Есть ли что-то лучше?
Ответы
Ответ 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);
Ответ 2
Первый вариант (плохой из-за броска, но MS будет работать для вас):
bool IsValidEmail(string email)
{
try {
var mail = new System.Net.Mail.MailAddress(email);
return true;
}
catch {
return false;
}
}
Вторая опция читается Я знал, как проверить адрес электронной почты, пока не прочитаю RFC и Спецификация RFC
Ответ 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
Ответ 5
Как проверить, что строки в допустимом формате электронной почты и регулярных выражений Microsoft документы.
https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-verify-that-strings-are-in-valid-email-format
Ответ 6
Я хотел бы предложить new EmailAddressAttribute().IsValid(emailTxt)
для дополнительной проверки до/после проверки с использованием RegEx
Помните, что EmailAddressAttribute
является частью System.ComponentModel.DataAnnotations namespace
.
Ответ 7
Проверка правильности электронной почты Regex
^[a-z0-9][-a-z0-9._][email protected]([-a-z0-9]+.)+[a-z]{2,5}$
Или же
^[a-z0-9][-a-z0-9._][email protected]([-a-z0-9]+[.])+[a-z]{2,5}$
Демо-ссылка:
https://regex101.com/r/kN4nJ0/53