По сути, вы ищете или в вашем выражении, ноль или любое число, начинающееся с 1-9
.
const re = /^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/
;[
'0',
'00',
'10',
'010',
'123',
'123.',
'123.0',
'123.00',
'123.000',
'0.1',
'0.10',
'0.100',
'00.10'
]
.forEach(
v => console.log(re.test(v) ? '✓' : '✗', v)
)
Для краткости я пропустил начальные и конечные пробельные совпадения - но, вообще говоря, если вы разрешаете это, это также может быть немного чище до .trim()
вход перед началом работы с ним. Также обратите внимание, что вам, вероятно, не нужно совпадать с периодом, если после него нет десятичных дробей.