Я бы использовал:
^(?:-1|[0-9]{1,3})$
Демо
Но на самом деле, я не использовал бы это регулярное выражение, если бы я использовал язык программирования. Вместо этого это требование было бы легче обработать проверкой диапазона, например, в Java:
int input = 10;
if (input >= -1 && input <= 999) {
System.out.println("MATCH");
}
Если вы также хотите разрешить пропуски, просто добавьте пустой случай в чередование:
^(?:-1|[0-9]{1,3}|)$