.NET: Парсинг адреса электронной почты - сохранить с RegExp или просто попробовать / поймать вокруг Mail.MailAddressParser?
Что бы вы порекомендовали получить простой результат, как "IsMailValid?" -> правда | ложь?
- это сохранить, чтобы использовать regExp
- лучше использовать.NET System...Mail.MailAddressParser с простой попыткой / поймать его?
Поскольку скорость не так важна, я думаю, что с MailAddressParser будет нормально?
С уважением
Джон
2 ответа
Учитывая ваши требования, в частности, скорость не требуется, я бы использовал Mail.MailAddressParser с try/catch. Гарантируется отфильтровать все, что среда выполнения.NET не может распознать как действительный адрес электронной почты, и это намного проще.
Хорошее регулярное выражение, скорее всего, сделает то же самое, но плохое регулярное выражение даст вам ложные срабатывания, ложные отрицания или и то, и другое.
Затраты на производительность при обработке исключений заставили бы меня пойти другим путем, если бы скорость была фактором, но в этом случае, с вашими требованиями, меньшим количеством кода, более читаемым кодом, и это "просто работает", все уравновешивает фактор производительности.
Разъяснение:
Я предполагаю, что ваш предполагаемый код будет выглядеть так:
try
{
System.Net.Mail.MailAddress address = new System.Net.Mail.MailAddress(somestring);
}
catch(Exception ex)
{
// handle invalid email addresses here.
}
И моя рекомендация только для этой ситуации. Это преднамеренное исключение из лучших практик не использования исключений, когда другие методы будут работать, и предлагается только из-за явного утверждения, что производительность не является фактором.
Использование.NET Best Practices против использования исключений, когда вы ожидаете сбоев на регулярной основе. Причина в том, что исключения очень дороги.
Я бы использовал Регулярное выражение в скомпилированном режиме, чтобы отфильтровать плохие адреса электронной почты.
Примерно так будет работать отлично:
Private Function ValidEmail(ByVal Email As String) As Boolean
If Text.RegularExpressions.Regex.IsMatch(Trim(Email), "^\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b$", RegexOptions.IgnoreCase Or RegexOptions.Compiled) = False Then
Return False
Else
Return True
End If
End Function