Проверка строк на соответствие формату электронной почты

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

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

✔️ Используйте небольшое регулярное выражение для проверки действительной структуры сообщения электронной почты.

✔️ Отправьте тестовое сообщение по адресу, предоставленному пользователем приложения.

❌ НЕ используйте регулярное выражение в качестве единственного способа проверки сообщения электронной почты.

Если вы попытаетесь создать идеальное регулярное выражение для проверки правильности структуры сообщения, выражение становится настолько сложным, что его практически невозможно отладить или улучшить. Регулярные выражения не могут проверить существование сообщения электронной почты, даже если оно структурировано правильно. Лучшим способом проверки сообщения электронной почты является отправка тестового сообщения электронной почты по адресу.

Предупреждение

При использовании System.Text.RegularExpressions для обработки ненадежных входных данных передайте время ожидания. Злоумышленник может предоставить входные данные RegularExpressions, вызывая атаку типа "отказ в обслуживании". API платформы ASP.NET Core, использующие RegularExpressions, передают время ожидания.

Пример

В примере определяется метод, который возвращаетtrue, если строка содержит допустимый IsValidEmail адрес электронной почты, и false если он не принимает никаких других действий.

Чтобы проверить, что адрес электронной почты допустим, метод IsValidEmail вызывает метод Regex.Replace(String, String, MatchEvaluator) с шаблоном регулярного выражения (@)(.+)$ для выделения доменного имени из адреса электронной почты. Третий параметр — это делегат MatchEvaluator , представляющий метод, который обрабатывает и заменяет найденный текст. Шаблон регулярного выражения интерпретируется следующим образом:

Расписание Description
(@) Совпадение с символом @. Это часть первой группы записи.
(.+) Совпадение с одним или несколькими вхождениями любого символа. Это часть второй группы записи.
$ Совпадение должно заканчиваться в конце строки.

Доменное имя, а также символ @, передается методу DomainMapper . Метод использует IdnMapping класс для перевода символов Юникода, которые находятся за пределами диапазона символов US-ASCII в Punycode. Метод также устанавливает флаг invalid в значение True, если метод IdnMapping.GetAscii находит какие-либо недопустимые символы в доменном имени. Метод возвращает доменное имя в формате Punycode, которому предшествует символ @, методу IsValidEmail .

Совет

Рекомендуется использовать простой шаблон регулярного выражения (@)(.+)$ для нормализации домена, а затем возвратить значение, указывающее, что проверка завершилась успешно или сбоем. Однако в примере в этой статье описывается, как использовать регулярное выражение для проверки электронной почты. Независимо от того, как вы проверяете электронную почту, всегда следует отправлять тестовую почту на адрес, чтобы убедиться, что он существует.

Метод IsValidEmail затем вызывает метод Regex.IsMatch(String, String), чтобы убедиться, что адрес соответствует шаблону регулярного выражения.

Метод IsValidEmail просто определяет, является ли формат электронной почты допустимым для адреса электронной почты; он не проверяет наличие сообщения электронной почты. Кроме того, IsValidEmail метод не проверяет, является ли доменное имя верхнего уровня допустимым доменным именем, перечисленным в базе данных корневой зоны IANA, для которой потребуется операция поиска.

using System;
using System.Globalization;
using System.Text.RegularExpressions;

namespace RegexExamples
{
    class RegexUtilities
    {
        public static bool IsValidEmail(string email)
        {
            if (string.IsNullOrWhiteSpace(email))
                return false;

            try
            {
                // Normalize the domain
                email = Regex.Replace(email, @"(@)(.+)$", DomainMapper,
                                      RegexOptions.None, TimeSpan.FromMilliseconds(200));

                // Examines the domain part of the email and normalizes it.
                string DomainMapper(Match match)
                {
                    // Use IdnMapping class to convert Unicode domain names.
                    var idn = new IdnMapping();

                    // Pull out and process domain name (throws ArgumentException on invalid)
                    string domainName = idn.GetAscii(match.Groups[2].Value);

                    return match.Groups[1].Value + domainName;
                }
            }
            catch (RegexMatchTimeoutException e)
            {
                return false;
            }
            catch (ArgumentException e)
            {
                return false;
            }

            try
            {
                return Regex.IsMatch(email,
                    @"^[^@\s]+@[^@\s]+\.[^@\s]+$",
                    RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
            }
            catch (RegexMatchTimeoutException)
            {
                return false;
            }
        }
    }
}
Imports System.Globalization
Imports System.Text.RegularExpressions

Public Class RegexUtilities
    Public Shared Function IsValidEmail(email As String) As Boolean

        If String.IsNullOrWhiteSpace(email) Then Return False

        ' Use IdnMapping class to convert Unicode domain names.
        Try
            'Examines the domain part of the email and normalizes it.
            Dim DomainMapper =
                Function(match As Match) As String

                    'Use IdnMapping class to convert Unicode domain names.
                    Dim idn = New IdnMapping

                    'Pull out and process domain name (throws ArgumentException on invalid)
                    Dim domainName As String = idn.GetAscii(match.Groups(2).Value)

                    Return match.Groups(1).Value & domainName

                End Function

            'Normalize the domain
            email = Regex.Replace(email, "(@)(.+)$", DomainMapper,
                                  RegexOptions.None, TimeSpan.FromMilliseconds(200))

        Catch e As RegexMatchTimeoutException
            Return False

        Catch e As ArgumentException
            Return False

        End Try

        Try
            Return Regex.IsMatch(email,
                                 "^[^@\s]+@[^@\s]+\.[^@\s]+$",
                                 RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250))

        Catch e As RegexMatchTimeoutException
            Return False

        End Try

    End Function
End Class

Возможные интерпретации шаблона регулярного выражения ^[^@\s]+@[^@\s]+\.[^@\s]+$ в этом примере показаны в следующей таблице. Регулярное выражение компилируется с флагом RegexOptions.IgnoreCase.

Расписание Description
^ Соответствие должно обнаруживаться в начале строки.
[^@\s]+ Совпадение с одним или несколькими вхождениями любого символа, кроме символа @ или пробела.
@ Совпадение с символом @.
[^@\s]+ Совпадение с одним или несколькими вхождениями любого символа, кроме символа @ или пробела.
\. Совпадение с символом точки.
[^@\s]+ Совпадение с одним или несколькими вхождениями любого символа, кроме символа @ или пробела.
$ Совпадение должно заканчиваться в конце строки.

Внимание

Это регулярное выражение не предназначено для покрытия каждого аспекта допустимого адреса электронной почты. Он предоставляется в качестве примера для расширения по мере необходимости.

См. также