如何:验证字符串是否为有效的电子邮件格式

下面的示例验证一个字符串是否为有效的电子邮件格式。

示例

该示例定义 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}))$ 可以按下表中的方式解释。

模式

说明

^

从字符串的开头部分开始匹配。

(?("")

确定第一个字符是否为引号。 (?("") 为替换构造的开头。

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

如果第一个字符是引号,则匹配一个开始引号,后跟至少一个任意字符,再后跟一个结束引号。 字符串应以 at 符号 (@) 结束。

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

如果第一个字符不是引号,则匹配从 a 到 z 的任意字母字符或从 0 到 9 的任意数字字符。

(\.(?! \.))

如果下一个字符为句点,则匹配它。 如果下一个字符不为句点,则看下一个字符并继续进行匹配。 (?!\.) 是宽度为零的负预测先行断言,可防止两个连续句号出现在电子邮件地址的本地部分中。

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

如果下一个字符不为句点,则匹配任意单词字符或下列字符之一:-!#$%'*+=?^`{}|~。

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

匹配替换模式(一个句点,后跟一个非句点或许多字符中的某个字符)零次或多次。

@

匹配 @ 字符。

(?<=[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 中的某个值),后跟一个单词字符或连字符的零个或多个匹配项,接着跟一个字母数字字符(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 正则表达式