Поделиться через


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

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

Пример

В примере задается метод IsValidEmail, который возвращает значение true, если строка содержит допустимый адрес электронной почты, и значение false, если нет, но не выполняет никаких других действий. Чтобы проверить правильность адреса электронной почты, метод вызывает метод Regex.IsMatch(String, String), который проверяет, соответствует ли адрес шаблону регулярного выражения. Метод IsValidEmail можно использовать для отсеивания адресов электронной почты, содержащих недопустимые символы, перед сохранением адресов в базе данных или их отображением на странице ASP.NET.

Следует отметить, что метод IsValidEmail не выполняет проверку подлинности для проверки адреса электронной почты. Он просто проверяет, является ли его формат допустимым для адреса электронной почты.

Imports System.Text.RegularExpressions

Module RegexUtilities
   Function IsValidEmail(strIn As String) As Boolean
       ' Return true if strIn is in valid e-mail format.
       Return Regex.IsMatch(strIn, _
              "^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" + _
              "(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$")
   End Function
End Module
using System;
using System.Text.RegularExpressions;

public class RegexUtilities
{
   public static bool IsValidEmail(string strIn)
   {
       // Return true if strIn is in valid e-mail format.
       return Regex.IsMatch(strIn, 
              @"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" + 
              @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$"); 
   }
}

Возможные интерпретации шаблона регулярного выражения ^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$ в этом примере показаны в следующей таблице.

Шаблон

Описание

^

Соответствие должно обнаруживаться в начале строки.

(?("")

Определение, является ли первый символ кавычкой. (?("") является началом конструкции изменения.

((?("")("".+?""@)

Если первый символ является кавычкой, имеется соответствие открывающей кавычки, после которой следует как минимум одно вхождение любого символа с последующей закрывающей кавычкой. Строка должна заканчиваться знаком @.

|(([0-9a-zA-Z]

Если первый символ не является кавычкой, имеется соответствие любой буквы с A до Z или любой цифре от 0 до 9.

(\.(?! \.))

Если следующим символом является точка, имеется соответствие. Если этот символ не является точкой, выполняется поиск вперед к следующему символу и продолжается поиск соответствия. (?!\.) является утверждением отрицательного поиска вперед нулевой ширины, предотвращающим отображение двух последовательных точек в локальной части адреса электронной почты.

|[-!#\$%&'\*\+/=\? \^`\{\}\|~\w]

Если следующий символ не является точкой, имеется соответствие любого символа слова или одного из следующих символов: -!#$%'*+=?^`{}|~.

((\.(?! \.))|[-!#\$%'\*\+/=\? \^`\{\}\|~\w])*

Соответствие шаблону изменения (точка, после которой следует символ, отличный от точки, или одна цифра) 0 или несколько раз.

@

Соответствие символу @.

(?<=[0-9a-zA-Z])

Продолжение поиска соответствия, если символ, предшествующий символу @, является буквой от A до Z, от a до z или цифрой от 0 до 9. Конструкция (?<=[0-9a-zA-Z]) определяет утверждение положительного поиска вперед нулевой ширины.

(?(\[)

Проверка, является ли символ, следующий после символа @, открывающей круглой скобкой.

(\[(\d{1,3}\.){3}\d{1,3}\])

Если этот символ является открывающей круглой скобкой, имеется соответствие открытой круглой скобки, после которой идет IP-адрес (четыре группы из одной-трех цифр, разделенные точкой) и закрывающая круглая скобка.

|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6})

Если символ, следующий за @, не является открывающей круглой скобкой, имеется соответствие одного буквенно-цифрового символа со значением A-Z, a-z или 0-9 с последующими 0 или несколькими вхождениями символа слова или дефиса, за которыми следует буквенно-цифровой символ со значением A-Z, a-z или 0-9 с последующей точкой. Этот шаблон можно повторить один или несколько раз, после него должны следовать от двух до шести буквенно-цифровых (a-z, A-Z) символов. Эта часть регулярного выражения предусмотрена для захвата имени домена.

Компиляция кода

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

Public Class Application
   Public Shared Sub Main()
      Dim emailAddresses() As String = { "david.jones@proseware.com", "d.j@server1.proseware.com", _
                                         "jones@ms1.proseware.com", "j.@server1.proseware.com", _
                                         "j@proseware.com9", "js#internal@proseware.com", _
                                         "j_9@[129.126.118.1]", "j..s@proseware.com", _
                                         "js*@proseware.com", "js@proseware..com", _
                                         "js@proseware.com9", "j.s@server1.proseware.com" }

      For Each emailAddress As String In emailAddresses
         If RegexUtilities.IsValidEmail(emailAddress) Then
            Console.WriteLine("Valid: {0}", emailAddress)
         Else
            Console.WriteLine("Invalid: {0}", emailAddress)
         End If      
      Next                                            
   End Sub
End Class
' The example displays the following output:
'       Valid: david.jones@proseware.com
'       Valid: d.j@server1.proseware.com
'       Valid: jones@ms1.proseware.com
'       Invalid: j.@server1.proseware.com
'       Invalid: j@proseware.com9
'       Valid: js#internal@proseware.com
'       Valid: j_9@[129.126.118.1]
'       Invalid: j..s@proseware.com
'       Invalid: js*@proseware.com
'       Invalid: js@proseware..com
'       Invalid: js@proseware.com9
'       Valid: j.s@server1.proseware.com
public class Application
{
   public static void Main()
   {
      string[] emailAddresses = { "david.jones@proseware.com", "d.j@server1.proseware.com", 
                                  "jones@ms1.proseware.com", "j.@server1.proseware.com", 
                                  "j@proseware.com9", "js#internal@proseware.com", 
                                  "j_9@[129.126.118.1]", "j..s@proseware.com", 
                                  "js*@proseware.com", "js@proseware..com", 
                                  "js@proseware.com9", "j.s@server1.proseware.com" };
      foreach (string emailAddress in emailAddresses)
      {
         if (RegexUtilities.IsValidEmail(emailAddress))
            Console.WriteLine("Valid: {0}", emailAddress);
         else
            Console.WriteLine("Invalid: {0}", emailAddress);
      }                                            
   }
}
// The example displays the following output:
//       Valid: david.jones@proseware.com
//       Valid: d.j@server1.proseware.com
//       Valid: jones@ms1.proseware.com
//       Invalid: j.@server1.proseware.com
//       Invalid: j@proseware.com9
//       Valid: js#internal@proseware.com
//       Valid: j_9@[129.126.118.1]
//       Invalid: j..s@proseware.com
//       Invalid: js*@proseware.com
//       Invalid: js@proseware..com
//       Invalid: js@proseware.com9
//       Valid: j.s@server1.proseware.com

См. также

Основные понятия

Регулярные выражения в .NET Framework