Pues un problema con una solución extraordinariamente sencilla
Para que los marcadores de principio (^) y final ($) funcionen en un OR, debes agruparlo todo, si no tomará a cada subexpresión de forma individual.
PD: Los rangos numéricos no se suelen validar con RegExp porque para eso está el lenguaje