Вот грубый, но эффективный подход: перечислите все возможности и используйте чередование.
^(-\d+\.\d*[1-9]\d*|-\d*[1-9]\d*\.\d+|^\d+\.\d+)$
Обратите внимание, что ваши правила допускают совпадение начальных нулей на числе, например, 01.1
или -01.0
,Вы можете отклонить их с еще более грубыми
^(-?0\.\d*[1-9]\d*|-[1-9]\d*\.\d*[1-9]\d*|-[1-9]\d*\.\d+|^[1-9]\d*\.\d+|0.0+)$
Тестами:
const permissive = /^(-\d+\.\d*[1-9]\d*|-\d*[1-9]\d*\.\d+|^\d+\.\d+)$/;
const strict = /^(-?0\.\d*[1-9]\d*|-[1-9]\d*\.\d*[1-9]\d*|-[1-9]\d*\.\d+|^[1-9]\d*\.\d+|0.0+)$/;
`
0.0
0.00
0.001
0.12
1.00
1.12
-0.123
-1.000
-1.123
10.10
2.2
-2.2
0.00
-10.010
0.101
-0.0
-0.00
-0.000
-2.
.0
-.0
.012
1.
12.
00.
0.
-001.0
-01.0
01.1
010.1010
000.000
00.0
`.split("\n").filter(e => e).forEach(test =>
console.log(
test, "=> permissive:", permissive.test(test),
"... strict:", strict.test(test)
)
);