.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
Другие вопросы по тегам