Рассмотрим эту схему:
^(?:[0-3](?:\.[0-9]+)?|4(?:\.[0-4][0-9]*)?|4\.50*|-[0-9]+(?:\.[0-9]+)?)$
^^^ ^^^ ^^^ ^^^
0 to 3 4.0...4.4999... 4.5 any negative number
Это означает совпадение от 0
до 3
, за которым следует любой необязательный десятичный компонент или 4
, за которым следуют 0
до 4
, затем любое другое число. Последняя часть чередования допускает любое отрицательное число.
Демо
Но, как говорится, гораздо более простой способ сделать это сравнение - использовать оператор неравенства в вашем языке программирования. Например, приведенное выше сложное регулярное выражение можно заменить в Java с помощью:
float f = 3.4f;
if (f <= 4.5f) {
System.out.println("match");
}