Expresión regular que coincide con un patrón o es una cadena vacía


84

Tengo la siguiente expresión regular que coincide con un formato de dirección de correo electrónico:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$

Esto se usa para la validación con un formulario que usa JavaScript. Sin embargo, este es un campo opcional. Por lo tanto, ¿cómo puedo cambiar esta expresión regular para que coincida con un formato de dirección de correo electrónico o una cadena vacía?

Desde mi conocimiento limitado de expresiones regulares, creo que \bcoincide con una cadena vacía y |significa "O", así que intenté hacer lo siguiente, pero no funcionó:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$|\b

5
Si debe validar un correo electrónico, sea lo más permisivo posible. Se sorprenderá de lo fácil que es perder direcciones de correo electrónico reales, válidas y funcionales con expresiones regulares caseras. Su expresión regular, por ejemplo, fallará en estas direcciones válidas: joe_blow@foo.com, micro$oft@apple.com, root @ localhost, siegfried+roy@lasvegas.com.
Zano

De acuerdo con Zano, solo eche un vistazo a esta expresión regular ex-parrot.com/pdw/Mail-RFC822-Address.html
Anders

@Anders wow, ¡esa es una expresión regular muy compleja! Creo que he subestimado la complejidad de las expresiones regulares
Curt

4
No, creo que ha subestimado la complejidad de la validación de correo electrónico :-)
Zano

Respuestas:


199

Para hacer coincidir patterno una cadena vacía, use

^$|pattern

Explicación

  • ^y $son el principio y el final de las anclas de cadena respectivamente.
  • |se utiliza para denotar alternativas, por ejemplo this|that.

Referencias


En \b

\ben la mayoría de los sabores es un ancla de "límite de palabras". Es una coincidencia de ancho cero, es decir, una cadena vacía, pero solo coincide con esas cadenas en lugares muy específicos , es decir, en los límites de una palabra.

Es decir, \bse ubica:

  • Entre consecutivos \wy \W(cualquier orden):
    • es decir, entre un carácter de palabra y un carácter que no es de palabra
  • Entre ^y\w
    • es decir, al principio de la cadena si comienza con \w
  • Entre \wy$
    • es decir, al final de la cadena si termina con \w

Referencias


Sobre el uso de expresiones regulares para hacer coincidir direcciones de correo electrónico

Esto no es trivial según la especificación.

Preguntas relacionadas


10

Una alternativa sería colocar su expresión regular entre paréntesis que no capturan. Luego, haga que esa expresión sea opcional usando el ?calificador, que buscará 0 (es decir, una cadena vacía) o 1 instancias del grupo no capturado.

Por ejemplo:

/(?: some regexp )?/

En su caso, la expresión regular se vería así:

/^(?:[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+)?$/

¡No es |necesario el operador "o"!

Aquí está la documentación de Mozilla para la sintaxis de expresiones regulares de JavaScript.


8

No estoy seguro de por qué querría validar una dirección de correo electrónico opcional, pero le sugiero que use

^$|^[^@\s]+@[^@\s]+$

sentido

^$        empty string
|         or
^         beginning of string
[^@\s]+   any character but @ or whitespace
@         
[^@\s]+
$         end of string

No detendrá los correos electrónicos falsos de todos modos y de esta manera no detendrá las direcciones válidas.


Si no se ingresa una dirección en el campo, se ingresa un valor NULO en la base de datos, por lo tanto, esto se puede resolver cuando se trata de enviar boletines, etc. Aprecio que esto no detendrá las direcciones falsas, y yo no creo que eso es posible en absoluto con Regex, pero al menos minimizará el error humano
Curt

1
También tengo clientes que lo solicitan con frecuencia. En realidad, es solo para evitar que los clientes hagan algo estúpido como ingresar su número de teléfono en el campo de correo electrónico.
Kelly Gendron

Solo quería comprobar si había una cadena vacía. ^ $ trabajado
Subhashi

1

\ b coincide con el límite de una palabra. Creo que puedes usar ^ $ para una cadena vacía.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.