.NET: Парсинг адреса электронной почты - сохранить с помощью RegExp или просто попробовать / поймать Mail.MailAddressParser? - PullRequest
1 голос
/ 21 июля 2011

что бы вы посоветовали, чтобы получить простой результат, например "IsMailValid?"-> true | false?

  • это сохранить для использования regExp
  • лучше ли использовать систему .NET ... Mail.MailAddressParser с простой попыткой / поймать его?

Поскольку скорость не так важна, я думаю, что с MailAddressParser все будет в порядке?

С уважением

Джон

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Учитывая ваши требования, в частности, скорость не нужна, я бы использовал 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.
}

И моя рекомендация только для этой ситуации. Это преднамеренное исключение из лучших практик не использования исключений, когда другие методы будут работать, и только , предложенных из-за явного утверждения, что производительность не является фактором .

0 голосов
/ 21 июля 2011

Недопустимо .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
...