Причина в том, что *
примет 0 или больше. Чисто пустая строка имеет 0 номеров и, следовательно, соответствует требованиям. Вам нужно 1 или больше, поэтому используйте +
вместо.
^(0|[1-9][0-9]+)$
EDIT
Вот Эндрюс более надежное и простое решение.
^\d+$