2008-12-15 54 views
10

Estoy trabajando en un proyecto pequeño en VB.Net donde obtengo una entrada de un cuadro de texto y necesito verificar que se trata de una dirección de correo electrónico.Validar el correo electrónico con expresión regular VB.Net

Encontré esta expresión "^ [_ a-z0-9 -] + (. [_ A-z0-9 -] +) @ [a-z0-9 -] + (. [A-z0-9 -] +) (. [Az] {2,4}) $ ", pero no puedo encontrar la manera de probar si pasa.

Quiero un poco de código como:

if not txtEmail.text = regexString then 
    something happens.. 
else 
    something else happens.. 
end if 
+1

Me permite señalar el hecho de que si Google de " vb.net regex ", el enlace _first_ le da instrucciones paso a paso para esto? – Svante

+2

Es una buena pregunta para tener registrada en StackOverflow. No veo nada de malo en preguntar esto aquí. – Jeffrey

Respuesta

18

Utilice la clase System.Text.RegularExpressions.Regex:

Function IsEmail(Byval email as string) as boolean 
    Static emailExpression As New Regex("^[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$") 

    return emailExpression.IsMatch(email) 
End Function 

Lo más importante a entender acerca de esta respuesta es que no he escrito la expresión regular a mí mismo. Hay tantas formas equivocadas que parecen correctas, y hay varios niveles de detalle a los que se puede llevar esto. Por ejemplo, ¿desea restringir esto a dominios de nivel superior válidos y, de ser así, cómo está explicando el hecho de que ahora están agregando ocasionalmente nuevos TLD? Si la expresión regular es el lugar más apropiado para esa prueba, o debería tener un código separado para esa verificación? Incluso la expresión en esta respuesta ahora es muy obsoleta ya que fue originalmente creada. Lo que recomiendo es encontrar un recurso que pueda usar para la expresión que sabe que se mantendrá.

+3

'If ... Then Return True Else Return False' está seguramente en el top ten de anti-patrones de todos los tiempos. : -/ –

+0

Sí, es un mal hábito que adquirí en mi último concierto, donde la política impedía devolver los resultados de expresiones booleanas directamente. Arregla la muestra –

+0

Encontré que debe ser "Como nuevo System.Text.RegularExpressions.Regex" donde dice "Como nuevo Regex" Thx para la ayuda :) – AndersE

5

Hay un gran sitio web para este tipo de cosas, http://regexlib.com/. No solo tiene una aplicación de prueba donde puedes pegar una expresión regular y probarla, pero también hay una biblioteca de expresiones regulares que puedes usar con comentarios de la comunidad sobre su validez, etc. No soy un gurú de expresiones regulares, por lo que Voy aquí cuando necesito una expresión regular rápida.

Además, si está pensando en desarrollar expresiones regulares usted mismo, hay una excelente herramienta llamada Regex Buddy que le permitirá crear y probar sus expresiones regulares sobre la marcha utilizando una interpretación fácil de entender en inglés de su expresión regular.

+0

Tuve un caso en el que un correo electrónico estaba fallando en la expresión regular más simple"^[_a-z0-9 -] + (. [a-z0-9 -] +) @ [a-z0-9 -] + (. [a-z0-9 -] +) * (. [az] { 2,4}) $ ". Volviendo aquí, utilicé regexlib que Anderson tuvo la amabilidad de compartir y buscar las expresiones regulares de "correo electrónico" mejor calificadas. Hubo 4 hits y este fue el primero de la lista y funcionó mejor para mí: "^ ((([! # $% & '* + \ -/=?^_' {|} ~ \ W]) | ([! # $% & '* + \ -/=?^_ '{|} ~ \ w] [! # $% &' * + \ -/=?^_' {|} ~ \. \ w ] {0,} [! # $% & '* + \ -/=?^_ '{|} ~ \ W])) [@] \ w + ([-.] \ W +) * \. \ W + ([-.] \ w +) *) $ "página de origen y prueba aquí: http://regexlib.com/RETester.aspx?regexp_id=2558 –

2

Esa expresión regular no es realmente completa ... de hecho ... la mayoría no (consulte this article, o this one).

A menos que realmente disfrute del dolor, la expresión regular no es la forma correcta de validar una dirección de correo electrónico.

+1

¿Podría decirles a todos cuál es la forma correcta de validar una dirección de correo electrónico en .net? ? –

-2

Dirección de correo electrónico: RFC 2822 (simplificado) Coincide con una dirección de correo electrónico normal. No verifica el dominio de nivel superior. Requiere que la opción "sin distinción de mayúsculas y minúsculas" esté activada.

Dim FoundMatch As Boolean 
Try 
    FoundMatch = Regex.IsMatch(txtEmail.text, "\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase) 
Catch ex As ArgumentException 
    'Syntax error in the regular expression 
End Try 

If Not FoundMatch Then 
    Error = True 
Else 
    Error = False 
End If 
+0

La expresión está interrumpida (por ejemplo, no permite tld-only-addresses). Consulte http://stackoverflow.com/questions/369543/validating-e-mail-with-regular-expression-vbnet#369614 – bzlm

+0

El ejemplo no está roto. No verifica los dominios de nivel superior. Como mencioné en mi comentario. Vea mi otro comentario para uno que lo haga. – Mick

+3

Nunca entenderé por qué alguien escribiría una declaración IF como la última en este fragmento. Eso es una locura Debería ser: Error = No FoundMatch –

6

Escoja su favorito de expresiones regulares my article on matching email addresses with a regex, y conectarlo a este código de Visual Basic:

If Regex.IsMatch(SubjectString, "regex") Then 
    Error = False 
Else 
    Error = True 
End If 

La mejor expresión regular para que coincida con una dirección de correo electrónico es un tema controvertido que yo no quiero llegar aquí. Mi artículo analiza los problemas que debe tener en cuenta al elegir una expresión regular. La expresión regular en la respuesta de Joel Coehoorn definitivamente no es buena.

+0

Bonita descripción de varias compensaciones en la página web vinculada. – WileCau

5

Posiblemente fuera de tema ya que no es una solución expresiones regulares, pero sólo podía utilizar algunas de las características integradas de .NET 2.0:

try 
{ 
    MailAddress email = new MailAddress(txtEmail.Text); 
} 
catch(FormatException fe) 
{ 
    // output error 
} 
+1

Esto está en todas partes en el proyecto en el que estoy trabajando en este momento y lo estoy arrancando. No veo cómo arrojar una excepción es una buena lógica o técnica de validación, aparte de cualquier cosa, es una tarea costosa. No dude en corregirme aunque –

+0

Me costó conseguir que esto se rompa, le pasé todo tipo de correos basura y se los tragué sin excepción y los quité de mi código. –

Cuestiones relacionadas