Ваш шаблон (0|[1-9][0-9]*)(.[0-9]+)?
соответствует всем примерам, потому что вторая часть (.[0-9]+)?
не учитывает, что последнее совпадение должно быть 1-9. Обратите внимание, что вы должны экранировать точку \.
, чтобы буквально соответствовать ей.
Вы можете обновить вторую часть вашего паттерна так, чтобы она соответствовала 0+ раз [0-9]*
и убедиться, что совпадение заканчивается на [1-9]
:
^(0|[1-9][0-9]*)(\.[0-9]*[1-9])?$
Regex demo
Шаблон соответствует:
^
Начало строки
(0|[1-9][0-9]*)
Группа захвата, соответствует 0 или 1, затем 0+ раз 0-9
(
Дополнительная группа захвата для соответствия
\.[0-9]*[1-9]
Совпадение .
, затем 0+ раз 0-9, затем 1-9
)?
Закрыть группу
$
Конец строки
Если вы, например, не обращаетесь к группам захвата для дальнейшей обработки, вы можете вместо этого сделать их не захватывающими (?:
.