Регулярное выражение для диапазона чисел от 0.5 до бесконечности
В регулярных выражениях нет готовых шаблонов для диапазонов чисел, тем более дробных. Потому что регулярки — это в первую очередь обработка текста. Регулярки умеют работать только с отдельными цифрами, а не числами. Но числа — это текст, состоящий из цифр, записаный определенным шаблоном. Т. е. нужно отделять цифры — это знаки 0-9 и числа — составные «слова» из этих знаков.
Делим на подзадачи
Давайте подумаем над задачей. Наша большая задача на самом деле состоит из двух поменьше:
- Числа от 0.5 включительно до 1, не включая его в диапазон.
- Числа от 1 до ∞ включительно.
Напишем регулярные выражения для каждого случая отдельно.
Числа от 0.5 и больше, но меньше 1
Попробуем записать словами, что хотим получить.
Числа в диапазоне [0.5, 1):
- Обязательно начинаются с цифры 0.
- Обязательно после нуля должна быть точка или запятая.
- Обязательно должна быть цифра от 5 до 9 включительно.
- Необязательно могут быть дополнительные цифры после.
^0[.,][5-9]\d{0,}?$ — получилась такая регулярка:
- ^ — начало строки (чтобы не искать значения в любой части текста).
- 0 — собственно ноль.
- [.,] — любой из символов в скобках, в этом случае или запятая или точка.
- [5-9] — одна цифра от 5 до 9 включительно.
- \d{0,}? — любая цифра; {0,}? — нежадно повторенная 0 или больше раз.
- $ — конец строки (чтобы не искать значения в любой части текста).
Числа от 1 до ∞ включительно
Попробуем записать словами, что хотим получить.
- Обязательно число должно начинаться на цифру от 1-9, потому что числа меньше 1 нам не подходят.
- Необязательно могут быть любые дополнительные цифры после.
- Необязательно может быть «хвост» в виде дроби.
^[1-9]\d{0,}?([.,]\d{1,}?){0,1}$ — получилась такая регулярка:
- ^ — начало строки (чтобы не выцеплять значения в любой части текста).
- [1-9] — цифра от 1 до 9 включительно.
- \d{0,}? — любая цифра; {0,}? — нежадно повторенная 0 или больше раз.
- ([.,]\d{1,}?){0,1} — [.,] — точка или запятая, после которой \d{1,}? одна или несколько цифр нежадно повторенных. Выражение обернули в круглые скобки, чтобы для него целиком задать правило {0,1} — ноль или один раз.
- $ — конец строки (чтобы не искать значения в любой части текста).
Все вместе
Осталось самое простое: объединить несколько регулярных выражений в одно. Это довольно просто, нужно обернуть каждое выражение в отдельную группу при помощи круглых скобок (выражение), а потом поставить между выражениями знак ИЛИ — |. Получится (выражение 1)|(выражение 2).
Итог: (^0[.,][5-9]\d{0,}?$)|(^[1-9]\d{0,}?([.,]\d{1,}?){0,1}$)
Примечания
Некоторые части выражения можно менять для удобства записи, чтения или восприятия:
- \d — можно заменить на [0-9]
- {0,} — можно заменить на *
- {1,} — можно заменить на +
Также, для удобства, ^ и $ можно вынести из скобок и оставить в единственном экземпляре:
^((0[.,][5-9]\d{0,}?)|([1-9]\d{0,}?([.,]\d{1,}?){0,1}))$