Проблема с вашим регулярным выражением в том, что вы указали ?
для совпадения 0, что означает ноль или одно совпадение. Таким образом, в результате вы можете сопоставить 5-значные строки (и более крупные).
Проблема в том, что ?
дает 0 или 1, а затем ваш 1-9
тест всегда дает 1. Вы делаете совпадение 4 раза, так что вы можете сопоставить что угодно, от 4-значной до 8-значной строки.
Вот гораздо более простая версия, которую вы можете протестировать с помощью https://regexr.com/.
\b[0-9][1-9]{3}\b
Это проверяет 0-9 в первой позиции, а затем 1-9 в следующих 3, как требуется.
Пример вывода
yes: 1234
yes: 0123
no: 01234
no: 12345
no: 0001
yes: 0125