Compartir a través de


Cómo: Comprobar si las cadenas tienen un formato de correo electrónico válido

En el ejemplo siguiente se comprueba que una cadena tiene un formato de correo electrónico válido.

Ejemplo

En el ejemplo se define un método IsValidEmail, que devuelve true si la cadena contiene una dirección de correo electrónico válida y false si no es válida, pero no realiza ninguna otra acción. Para comprobar que la dirección de correo electrónico es válida, el método llama al método Regex.IsMatch(String, String) para comprobar que la dirección cumple un modelo de expresión regular. Puede usar IsValidEmail para filtrar las direcciones de correo electrónico que contienen caracteres no válidos antes de que la aplicación almacene las direcciones en una base de datos o las muestre en una página ASP.NET.

Tenga en cuenta que el método IsValidEmail no realiza la autenticación para validar la dirección de correo electrónico. Se limita a determinar si su formato es válido para una dirección de correo electrónico.

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}))$"); 
   }
}

En este ejemplo, el modelo de expresión regular ^(?("")("".+?""@)|(([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}))$ se puede interpretar como se muestra en la tabla siguiente.

Modelo

Descripción

^

Comenzar la búsqueda de coincidencia en el principio de la cadena.

(?("")

Determinar si el primer carácter es una comilla. (?("") es el principio de una construcción de alternancia.

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

Si el primer carácter es una comilla tipográfica, buscar una comilla inicial seguida por al menos un carácter cualquiera seguido, a su vez, por una comilla final. La cadena debe concluir con una arroba (@).

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

Si el primer carácter no es un signo de comillas dobles, buscar cualquier carácter alfabético de la a a la z o cualquier carácter numérico del 0 al 9.

(\.(?! \.))

Si el carácter siguiente es un punto, determinar que coincide. Si no lo es, buscar más adelante en el siguiente carácter y probar si coincide. (?!\.) es una aserción de búsqueda anticipada negativa de ancho igual a cero que evita que aparezcan dos puntos consecutivos en la parte local de una dirección de correo electrónico.

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

Si el carácter siguiente no es un punto, buscar cualquier carácter alfabético o uno de los siguientes caracteres: -!#$%'*+=?^`{}|~.

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

Buscar el modelo de alternancia (un punto seguido de algo que no sea un punto, o uno de varios caracteres) cero o más veces.

@

Buscar el carácter @.

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

Continuar buscando si el carácter que precede al carácter @ es uno de la A a la Z, de la a a la z o del 0 al 9. La construcción (?<=[0-9a-zA-Z]) define una aserción de búsqueda tardía positiva de ancho igual a cero.

(?(\[)

Comprobar si el carácter que va detrás de @ es un corchete de apertura.

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

Si lo es, buscar el corchete de apertura, seguido por una dirección IP (cuatro grupos de uno a tres dígitos, separados por puntos) y por un corchete de cierre.

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

Si el carácter que va detrás de @ no es un corchete de apertura, buscar un carácter alfanumérico con un valor de la A a la Z, de la a a la z o del 0 al 9, seguido por cero o más apariciones de un carácter alfabético o un guión, seguidas por un carácter alfanumérico con un valor de la A a la Z, de la a a la z o del 0 al 9, seguido por un punto. Este modelo se puede repetir una o más veces y debe ir seguido de entre dos y seis caracteres alfabéticos (a-z, A-Z). Esta parte de la expresión regular está diseñada para capturar el nombre de dominio.

Compilar el código

El método IsValidEmail puede estar incluido en una biblioteca de métodos de utilidad de expresión regular o puede incluirse como un método estático o de instancia privado en la clase de aplicación. Si se usa como un método estático en una biblioteca de expresiones regulares, se le puede llamar usando código como el siguiente:

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

Vea también

Conceptos

Expresiones regulares de .NET Framework