共用方式為


HOW TO:確認字串是否為有效的電子郵件格式

下列範例會確認字串是否為有效的電子郵件格式。

範例

此範例會定義 IsValidEmail 方法,如果字串包含有效的電子郵件地址,則這個方法會傳回 true,否則會傳回 false,但不會採取其他任何動作。 為了確認電子郵件地址是否有效,這個方法會呼叫 Regex.IsMatch(String, String) 方法,以確認地址符合規則運算式模式。 在應用程式將電子郵件地址儲存到資料庫,或顯示在 ASP.NET 網頁中之前,您可以先使用 IsValidEmail 篩選掉包含無效字元的電子郵件地址。

請注意,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)。

(\.(?! \.))

如果下一個字元是句號,則相符。 如果不是句號,則向右合樣下一個字元並繼續比對。 (?!\.) 是零寬度的右不合樣 (Negative Lookahead) 判斷提示,可防止電子郵件地址的本機部分出現兩個連續的句號。

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

如果下一個字元不是句號,則比對任何文字字元或下列其中一個字元:-!#$%'*+=?^`{}|~。

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

比對交替模式 (句號後面接著非句號,或某個字元) 零次以上。

@

比對 @ 字元。

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

如果位於 @ 字元前面的字元是 A 到 Z、a 到 z 或 0 到 9,則繼續比對。 (?<=[0-9a-zA-Z]) 建構可定義零寬度的左合樣 (Positive Lookbehind) 判斷提示。

(?(\[)

檢查 @ 後面的字元是否為左括號。

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

如果是左括號,則比對左括號後面是否接著 IP 位址 (四組 1 至 3 位數的數字,而每組數字均以句號隔開) 與右括號。

|(([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 的英數字元,最後接著句號。 這個模式可以重複一次或多次,而且後面應接著 2 至 6 個字母 (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 規則運算式