Regex para validar nombre de usuario

Estoy tratando de entender qué hay de malo con este patrón de expresiones regulares:

'/^[a-z0-9-_\.]*[a-z0-9]+[a-z0-9-_\.]*{4,20}$/i'

Lo que intento hacer es validar el nombre de usuario. Los caracteres permitidos son alfanuméricos, guiones, guiones bajos y puntos. La restricción que estoy tratando de implementar es tener al menos un carácter alfanumérico para que el usuario no pueda tener un apodo como este:_-_.

La función que estoy usando ahora es:

function validate($pattern, $string){
    return (bool) preg_match($pattern, $string);
}

Gracias

EDITA

Como dijo @mario, sí, aquí hay un problema con*{4,20}. Lo que intenté hacer ahora es agregar( ) pero esto no funciona, excepto:

'/^([a-z0-9-_\.]*[a-z0-9]+[a-z0-9-_\.]*){4,20}$/i'

Ahora coincide con 'aa - aa' pero no con 'aa--' y '--aa'. ¿Cualquier otra sugerencia

EDITA

al vez alguien quiera negar nombres de usuario que no se vean bien como " _ .. -a ". Esta expresión regular negará tener caracteres consecutivos no alfanuméricos:

/^(?=.{4,20}$)[a-z0-9]{0,1}([a-z0-9._-][a-z0-9]+)*[a-z0-9.-_]{0,1}$/i

En este caso_-this-is-me-_ no coincidirá, pero_this-is-me_ coincidirá

Que tengas un buen día y gracias a todos:)

Respuestas a la pregunta(7)

Su respuesta a la pregunta