Конечно, правильным способом было бы взять предоставленную строку, преобразовать ее в число (отлавливать ошибки, если это не анализируемое число), а затем сравнить это с действительными значениями.
Если это имеет в качестве регулярного выражения, это, конечно, возможно, но безобразно:
^(?:[1-9][0-9]?(?:\.[0-9]{1,2})?|0?.0[1-9]|0?.[1-9][0-9]?)$
Объяснение:
^ # start of string
(?: # either match
[1-9][0-9]? # a number between 1 and 99
(?:\.[0-9]{1,2})? # optionally followed by a decimal point and up to two digits
| # or
0?.0[1-9] # a number between 0.01 and 0.09 (optionally without leading 0)
| # or
0?.[1-9][0-9]? # a number between 0.1 and 0.99
) # end of alternation
$ # end of string
Конечно, в большинстве регулярных выраженийна диалектах вы можете использовать \d
вместо [0-9]
без изменения значения, но я думаю, что в этом случае придерживаться более длинной версии помогает удобочитаемость.
В Ruby, если ваша входная строка никогда не содержитсимвол новой строки:
if subject =~ /^(?:[1-9][0-9]?(?:\.[0-9]{1,2})?|0?.0[1-9]|0?.[1-9][0-9]?)$/
# Successful match
else
# Match attempt failed
end
Поскольку вы заботитесь о количестве значащих цифр, другим решением будет сначала проверить, выглядит ли ввод как число, и если он проходит этот тест, преобразовать его в число с плавающей точкой и проверитьесли он находится в диапазоне.
^(\d{1,2}|\d{0,2}\.\d{1,2})$
будет соответствовать любому числу (целое или десятичное с точностью до двух цифр после запятой) в диапазоне от 0 до 99,99.Тогда вам просто нужно проверить, является ли число> = 0,01.Преимущество этого подхода заключается в том, что вы можете легко расширить диапазон цифр, разрешенных до / после десятичной точки, если изменяются требования к действительным числам, а затем соответствующим образом настроить проверку значения.