Lo que se reduce a usar el sentido común. Si lo que intentas emparejar se convierte en una expresión regular de monstruo inmanejable, entonces debes dividirlo en expresiones pequeñas y lógicas o tienes que volver a pensar en tu solución.
Tome las direcciones de correo electrónico (según su ejemplo). Esta expresión regular sencilla (tomado de expresiones regulares de amigos) se corresponde con el 99% de todos los correos electrónicos por ahí:
\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b
Es corto y al grano y que rara vez se tenga problemas con él. Sin embargo, como señala el autor de RegEx Buddy, si su dirección de correo electrónico está en el raro ".museum" de dominio de alto nivel, no será aceptada.
Para que coincida con todas las direcciones de correo electrónico, debe cumplir con el estándar conocido como RFC 2822. Describe la multitud de formas en que se pueden formatear las direcciones de correo electrónico y es extremadamente complejo.
Aquí es una expresión regular muestra trataban de dar cumplimiento a la RFC 2822:
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"
(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x
0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]
(?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)
{3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08
\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Obviamente, esto se convierte en un problema de los rendimientos decrecientes. Es mejor utilizar la implementación de fácil mantenimiento que coincide con el 99% de las direcciones de correo electrónico frente al monstruoso que acepta el 99,9% de ellas.
Las expresiones regulares son una gran herramienta para tener en su caja de herramientas de programadores, pero no son una solución para todos sus problemas de análisis. Si encuentra que su solución RegEx comienza a ser extremadamente compleja, debe intentar dividirla lógicamente en expresiones regulares más pequeñas para que coincidan con partes de su texto o debe comenzar a buscar otros métodos para resolver su problema. Del mismo modo, simplemente hay problemas que las expresiones regulares, debido a su naturaleza, no pueden resolver (como dijo un afiche, no se adhiere al Regular Language).
Bueno, hay extensiones Perl. Sacan expresiones regulares de la clase de idiomas regulares. – ADEpt
Me gustaría ver un enfoque más pragmático, pero esta es la respuesta correcta hasta ahora. – Null303
Siguiendo el enlace ... "se puede describir mediante una expresión regular formal". Tu definición es circular. : P – BoltBait