How to: Verify That Strings are in Valid E-Mail Format

Microsoft Silverlight will reach end of support after October 2021. Learn more.

The following example verifies that a string is in valid e-email format. Note that the regular expression is not able to validate email addresses that contain Unicode characters outside the US-ASCII character range.

Example

The example defines an IsValidEmail method, which returns true if the string contains a valid e-mail address and false if it does not, but takes no other action. To verify that the e-mail address is valid, the method calls the Regex.IsMatch(String, String) method to verify that the address conforms to a regular expression pattern. You can use IsValidEmail to filter out e-mail addresses that contain invalid characters before your application stores the addresses in a database or displays them in an ASP.NET page.

Note that the IsValidEmail method does not perform authentication to validate the e-mail address. It merely determines whether its format is valid for an e-mail address.

Imports System.Text.RegularExpressions

Module RegexUtilities
   Function IsValidEmail(ByVal 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}))$"); 
   }
}

In this example, the regular expression pattern ^(?("")(""[^""]+?""@)|(([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}))$ can be interpreted as shown in the following table.

Pattern

Description

^

Begin the match at the start of the string.

(?("")

Determine whether the first character is a quotation mark. (?("") is the beginning of an alternation construct.

((?("")(""[^""]+?""@)

If the first character is a quotation mark, match a beginning quotation mark followed by at least one occurrence of any character other than a quotation mark, followed by an ending quotation mark. The string should conclude with an at sign (@).

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

If the first character is not a quotation mark, match any alphabetic character from a to z or any numeric character from 0 to 9.

(\.(?!\.))

If the next character is a period, match it. If it is not a period, look ahead to the next character and continue the match. (?!\.) is a zero-width negative lookahead assertion that prevents two consecutive periods from appearing in the local part of an e-mail address.

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

If the next character is not a period, match any word character or one of the following characters: -!#$%'*+=?^`{}|~.

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

Match the alternation pattern (a period followed by a non-period, or one of a number of characters) zero or more times.

@

Match the @ character.

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

Continue the match if the character that precedes the @ character is A through Z, a through z, or 0 through 9. The (?<=[0-9a-zA-Z]) construct defines a zero-width positive lookbehind assertion.

(?(\[)

Check whether the character that follows @ is an opening bracket.

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

If it is an opening bracket, match the opening bracket followed by an IP address (four sets of one to three digits, with each set separated by a period) and a closing bracket.

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

If the character that follows @ is not an opening bracket, match one alphanumeric character with a value of A-Z, a-z, or 0-9, followed by zero or more occurrences of a word character or a hyphen, followed by an alphanumeric character with a value of A-Z, a-z, or 0-9, followed by a period. This pattern can be repeated one or more times, and should be followed by two to six alphabetic (a-z, A-Z) characters. This portion of the regular expression is designed to capture the domain name.

Compiling the Code

The IsValidEmail method can be included in a library of regular expression utility methods, or it could be included as a private static or instance method in the application class. If it is used as a static method in a regular expression library, it can be called by using code such as the following:

Public Module Example
   Public Sub Demo(outputBlock As System.Windows.Controls.TextBlock)
      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
            outputBlock.Text += String.Format("Valid: {0}", emailAddress) + vbCrLf
         Else
            outputBlock.Text += String.Format("Invalid: {0}", emailAddress) + vbCrLf
         End If      
      Next                                            
   End Sub
End Module
' 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 Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      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))
            outputBlock.Text += String.Format("Valid: {0}\n", emailAddress);
         else
            outputBlock.Text += String.Format("Invalid: {0}\n", 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