El problema con el setInterval, es que al entrar al campo, se activa el intervalo, y si tardas 4 segundos en escribir, el intervalo se abra cumplido 100 veces(viendo el intervalo que asignaste), habrá validado pues 100 ocasiones.
Yo también había pensado en las RE, básicamente con
/\d.-/ abarcas el universo numérico, pero la forma mas óptima(según yo) es no dejar que entre al input, algo que no nos interesa. Además con el control de teclas la validación solo se da cuando el evento se cumple, por ejemplo en 4 segundos solo validará cuantas veces el usuario tecleo.