/^
La barra / es el inicio de la expresión regular, al igual que al final de ésta hay otra barra. El ^ a continuación indica que, el elemento que le sigue, debe estar al inicio de la cadena.
([a-zA-Z0-9_.-])
al llevar delante el ^ indica que la cadena debe comenzar con caracteres de la a a la z (minúsculas) de la A a la Z (mayúsculas) números entre el 0 y el 9, un punto, un guion medio o uno bajo. No son obligados, pero lo que haya debe ceñirse a esos caracteres propuestos.
+
El + es un cuantificador que indica cuántas veces debe aparecer lo que le precede (en este caso ([a-zA-Z0-9_.-]) ). En este caso, el cuantificador (+) indica que algunos de esos caracteres deben aparecer una o más veces.
@(([a-zA-Z0-9-])+.) ¿por qué no hay un + después del @?, y ¿por qué están anidados esos paréntesis?
al estar la arroba sola indica que sí o sí, debe estar. Por eso no lleva ningún más, o entonces podría aparecer una o más veces, y sólo ha de estar una (obvio)
Los paréntesis anidados unen dos posibilidades; la primera que aparezcan caracteres como los que están entre corchetes cuqantificados por el + que está detrás (que indica una o más veces) y por separado el punto, que deberá estár sí o sí. Y eso, agrupado entre paréntesis seguido de otro cuantificador (+) indica que debe aparecer en la cadena una o más veces.
+
este lo expliqué arriba
([a-zA-Z0-9]{2,4}) ¿para qué es el {2,4}?
indica que cualquiera de los caracteres de los que está entre los paréntesis deben aparecer 2,3 ó 4 veces.
+$/
el + indica que lo que le precede que explique dos líneas más arriba debe aparecer al menos una vez y el $ que así debe terminar la cadena. La barra / indica el cierre de la expresión regular.