Вот шаблон, который, кажется, работает:
^(?!0+(?:\.0+)?)\d*(?:\.\d+)?$
Демо
Объяснение:
^ from the start of the input
(?!0+(?:\.0+)?) assert that zero with/without a decimal zero component does not occur
\d* then match zero or more digits (includes null/empty case)
(?:\.\d+)? followed by an optional decimal component
$ end of the input
Использование отрицательного прогнозирующего утверждения для исключения любой формы нуля показалось мне самым простым способом удовлетворить ваше требование. Без нуля, оставшаяся часть шаблона для совпадения с положительным числом (или вообще без номера) довольно проста.