Немного длинный, но рассчитанный на наличие только одного возможного пути для каждой цифры (для быстрого сбоя):
^(?:
[1-8][0-9]{3,}
|
9 (?:
[0-4][0-9]{2,}
|
[6-9][0-9]+
|
5 (?:
[5-9][0-9]*
|
[0-4][0-9]+
)
)
)$
Обратите внимание, что ветви сортируются по вероятности.
Сжатый:
^(?:[1-8][0-9]{3,}|9(?:[0-4][0-9]{2,}|[6-9][0-9]+|5(?:[5-9][0-9]*|[0-4][0-9]+)))$
Примечание: выполнение этого шаблона регулярного выражения в большинстве случаев является неуместным и сложным (регулярное выражение не предназначено для решения арифметических задач). Поэтому, если вы можете, введите свою строку в целое число и протестируйте ее с помощью простого сравнения.