Чтобы сделать это с регулярным выражением, вам нужно что-то немного сложное:
^(?:0\.02[5-9]|0\.0[3-9]\d?|0\.[1-9]\d{0,2}|[1-9][0-9]?(?:\.\d{1,3})?)$
Вот это в Regex101
Вот как это работает в JS
const regex = /^(?:0\.02[5-9]|0\.0[3-9]\d?|0\.[1-9]\d{0,2}|[1-9][0-9]?(?:\.\d{1,3})?)$/;
const testValues = [ "0", "1", "99.999", "0.025", "0.024", "0.01" ];
testValues.forEach(value => console.log(value, regex.test(value)));
Пояснение к выражению: это набор OR, которые охватывают диапазон значений.Хотя вы можете сжать его больше, я постарался сохранить его логичным и читабельным:
0\.02[5-9]
- значения от 0.025
до 0.029
0\.0[3-9]\d?
-значения от 0.03
до 0.099
.Последняя цифра необязательна. 0\.[1-9]\d{0,2}
- значения от 0.1
до 0.999
.Последние две цифры необязательны.Дробная часть в каждом случае до настоящего времени является обязательной, поэтому 0
недопустимо. [1-9][0-9]?(?:\.\d{1,3})
- значения от 1 до 99,999.Опять же, десятичная точка и дробная часть устанавливаются как необязательные.Если они присутствуют, их может быть 1-3. - , все регулярное выражение помещается в группу без захвата, а затем вкладывается между якорями
^
и $
, чтобы убедиться, что строка ВСЕ соответствует.
Известные исключения с этим регулярным выражением:
- экспоненциальная форма / научная запись.Например:
3e1
или 3e-1
- числа, начинающиеся с нуля.Например:
01
, 02.345
- числа, начинающиеся со знака.Например:
+10
- значения, начинающиеся с десятичной части.Например:
0.2
, 0.123
- значения, заканчивающиеся точкой.Например, строки
1.
, 2.
- , содержащие пробел.Например:
" 1"
не будет соответствовать.Самый простой способ решить эту проблему - убедиться, что значения обрезаны перед тестированием.