regex - letras - probar expresiones regulares
¿Por qué las personas usan expresiones regulares para correo electrónico y otras validaciones complejas? (12)
Hay una serie de preguntas de expresiones regulares de correo electrónico que aparecen aquí, y estoy sinceramente desconcertado por qué las personas están usando estas expresiones de coincidencia increíblemente obtusas en lugar de un analizador muy simple que divide el correo electrónico en el nombre y tokens de dominio, y luego los valida contra los caracteres válidos permitidos para el nombre (no se puede hacer más comprobaciones en esta parte) y los caracteres válidos para el dominio (y supongo que podría agregar la verificación de todos los TLD del mundo y luego otro nivel de dominios de segundo nivel para los países con tal (es decir, com.uk)).
El problema real es que los tlds y slds siguen cambiando (contrariamente a la creencia popular), por lo que debe seguir actualizando la expresión regular si planea hacer todo este control de alto nivel siempre que los servidores de nombres de raíz envíen un cambio.
¿Por qué no tener un módulo que simplemente valida dominios, que se extrae de una base de datos, o un archivo plano, y opcionalmente verifica el DNS para los registros coincidentes?
Estoy hablando en serio, ¿por qué todos están tan interesados en inventar la expresión regular perfecta para esto? No parece ser una solución adecuada para el problema ...
Convencerme de que no solo es posible hacer en expresiones regulares (y satisfacer a todos) sino que es una solución mejor que un analizador / validador personalizado.
-Adán
El uso de expresiones regulares para esto no es una buena idea, como se ha demostrado extensamente en esas otras publicaciones.
Supongo que las personas continúan haciéndolo porque no saben nada o no les importa.
¿Un analizador será mejor? Tal vez tal vez no.
Sostengo que enviar un correo electrónico de verificación es la mejor manera de validarlo. Si desea verificar algo desde JavaScript, compruebe que tiene un signo ''@'' y algo antes y después. Si vas más estricto que eso, te tropiezas con una sintaxis que no conocías y tu validador se volverá demasiado restrictivo.
Además, tenga cuidado con ese esquema de validación TLD suyo, es posible que descubra que está asumiendo demasiado sobre lo que está permitido en un TLD.
Los recgexps son mucho más rápidos de usar, por supuesto, y solo validan lo que se especifica en el RFC. Escribir un analizador personalizado? ¿Qué? Toma 10 segundos usar una expresión regular.
y luego valida aquellos contra los caracteres válidos permitidos para el nombre (no se puede hacer más comprobaciones en esta parte)
Esto no es verdad. Por ejemplo, "ben..doom @ gmail.com" contiene solo caracteres válidos en la sección de nombre, pero no es válido.
En los idiomas que no tienen bibliotecas para la validación de correo electrónico, generalmente uso regex becasue
- Sé regex, y me resulta fácil de usar
- Tengo muchos amigos que saben regex y puedo colaborar con
- Para mí es rápido codificar, y el tiempo de mí es más costoso que el tiempo de procesador para la mayoría de las aplicaciones
- Para la mayoría de las direcciones de correo electrónico, funciona.
Estoy seguro de que muchas bibliotecas integradas utilizan su enfoque, y si desea abarcar todas las posibilidades, se vuelve ridículo. Sin embargo, también lo hace tu analizador. La especificación formal para las direcciones de correo electrónico es absurdamente compleja. Entonces, usamos una expresión regular que se acerca lo suficiente.
La gente lo hace porque en la mayoría de los idiomas es mucho más fácil escribir expresiones regulares que escribir y usar un analizador en el código (o al menos eso parece).
Si decide evitar las expresiones regulares, tendrá que escribir analizadores a mano o recurrir a herramientas externas (como yacc) para la generación de lexer / analizador. Esto es mucho más complejo que la comparación de expresiones regulares de una sola línea.
Es necesario contar con una biblioteca que facilite la escritura de analizadores directamente en el lenguaje X (donde "X" es C, C ++, C #, Java) para poder construir analizadores personalizados con la misma facilidad que los mezcladores de expresiones regulares.
Dichas bibliotecas se originaron en el terreno funcional (Haskell y ML), pero hoy en día existen "bibliotecas de combinadores de analizadores" para Java, C ++, C #, Scala y otros lenguajes principales.
La gente usa expresiones regulares para direcciones de correo electrónico, HTML, XML, etc. porque:
- Parece que deberían funcionar y a menudo funcionan para los casos más obvios.
- Ellos "saben" expresiones regulares. Cuando todo lo que tienes es un martillo, todos tus problemas parecen clavos.
- Escribir un analizador es más difícil (o parece más difícil) que escribir una expresión regular. En particular, escribir un analizador es más difícil que escribir una expresión regular que maneje los casos obvios en el # 1.
- No entienden la complejidad total de la tarea.
- No entienden las limitaciones de las expresiones regulares.
- Comienzan con una expresión regular que maneja los casos obvios y luego tratan de extenderla para manejar otros. Se bloquean en un enfoque.
- No saben que hay (probablemente) una biblioteca disponible para hacer el trabajo por ellos.
Las personas escriben expresiones regulares porque a la mayoría de los desarrolladores les gusta resolver un problema simple de la manera más "buena" y "eficiente" (lo que significa que debe ser lo más ilegible posible).
En Java, hay bibliotecas para verificar si una Cadena representa una dirección de correo electrónico sin que tenga que saber nada acerca de las expresiones regulares. Estas bibliotecas deberían estar disponibles para otros idiomas, aswel.
Al igual que Jamie Zawinski, dijo en 1997: "Algunas personas, cuando se enfrentan con un problema, piensan" Lo sé, usaré expresiones regulares ". Ahora tienen dos problemas".
Lo hacen porque ven "Quiero probar si este texto coincide con la especificación" y de inmediato piensan "Lo sé, usaré una expresión regular". sin entender completamente la complejidad de la especificación o las limitaciones de las expresiones regulares. Los regex son una herramienta maravillosa y poderosa para manejar una amplia variedad de tareas de correspondencia de texto, pero no son la herramienta perfecta para cada tarea y parece que muchas personas que las usan pierden de vista ese hecho.
Los Regex que captan la mayoría (pero no todos) de los errores comunes son relativamente fáciles de configurar e implementar. Toma más tiempo escribir un analizador personalizado.
No creo que la validación correcta del correo electrónico se pueda hacer con una sola expresión regular (¡ahora hay un desafío!). Uno de los problemas es que los comentarios se pueden anidar a una profundidad arbitraria tanto en la parte local como en el dominio.
Si desea validar una dirección contra las RFC 5322 y 5321 (las normas actuales), entonces necesitará una función de procedimiento para hacerlo.
Afortunadamente, este es un problema de productos básicos. Todo el mundo quiere el mismo resultado: cumplimiento de RFC. No es necesario que nadie vuelva a escribir este código una vez que haya sido resuelto por una función de código abierto.
Vea algunas de las alternativas aquí: http://www.dominicsayers.com/isemail/
Si conoces otra función que puedo agregar a la cabeza a cabeza, házmelo saber.
El factor: el conjunto de personas que entienden cómo escribir una expresión regular es mucho más grande que el conjunto de personas que entienden las restricciones formales en los idiomas regulares. Lo mismo ocurre con las "expresiones regulares" no regulares.
Solo estamos buscando una manera rápida de ver si la dirección de correo electrónico es válida para que podamos advertir al usuario que ha cometido un error o evitar que las personas entren basura fácilmente. Ir al servidor de correo y digitarlo es lento y poco confiable. La única forma real de estar seguro es recibir un correo electrónico de confirmación, pero el problema es solo dar una respuesta rápida al usuario antes de que tenga lugar el proceso de confirmación. Es por eso que no es tan importante ser estrictamente obediente. De todos modos, es un desafío y es divertido.
La tentación de usar RegExp, una vez que dominas los conceptos básicos, es muy grande. De hecho, RegExp parece tan poderoso que la gente naturalmente quiere comenzar a usarlo en todas partes. Realmente sospecho que hay mucha psicología involucrada aquí, como lo demuestra el cómic XKCD de Randall (y sí, es útil).
Hice una presentación introductoria sobre RegExp una vez y la diapositiva más importante advirtió sobre su uso excesivo. Era la única diapositiva que usaba letra en negrita . Creo que esto debería hacerse más a menudo.