Я использовал регулярное выражение, чтобы ограничить числа только от 3,00 до 100,00. Но оно разрешало числа от 100,01 до 100,99 - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть требование ограничить числа от 3,00 до 100,00 Я использовал приведенное ниже выражение

^([3-9]|[1-9][0-9]|100)+(\.\d{1,2})?$

Проблема с приведенным выше выражением заключается в том, что он допускает значения от 100,01 до 100,99, что должнобыть также ограниченным. Это также разрешает от 310 до 399, что необходимо ограничить.

Я использовал другой вариант того же выражения

^([3-9]|[1-9][0-9]|100.00)+(\.\d{1,2})?$

, который работал, как и ожидалось, но нам нужно ввести 100,00 впередать регулярное выражение вместо 100.

Есть ли способ, которым я могу достичь желаемого результата?

Ответы [ 4 ]

0 голосов
/ 04 декабря 2018

Может быть, это регулярное выражение будет работать для Вас:

^([3-9]|[1-9][0-9])(\.[0-9]+)?$|^100(\.0+)?$

Тест:

$ cat numeric.txt
0.0
3
3.0
3.00
3.001
2.99
99.99
99.999
100
100.0
100.00
100.01
100.99

$ egrep '^([3-9]|[1-9][0-9])(\.[0-9]+)?$|^100(\.0+)?$' numeric.txt
3
3.0
3.00
3.001
99.99
99.999
100
100.0
100.00
0 голосов
/ 04 декабря 2018

Вы можете попробовать этот помощник

^(?:100(?:\.0+)?|(?:[3-9]|[1-9][0-9])(?:\.\d{1,2})?)$

Демо

Объяснение

  • ^ - Якорь представляет начало строки.
  • (?:100(?:\.0+)?) - Это будет соответствовать 100, 100,0, 100,00 (любое количество десятичных нулей).
  • | - Чередование этоработает так же, как логическое ИЛИ.
  • (?:[3-9]|[1-9][0-9])(?:\.\d{1,2})?) - Это будет соответствовать любому числу от 3,00 до 99,99

Предложение

Всегда использовать незахват группы в случае, если вы снова не используете группу в своем регулярном выражении.

0 голосов
/ 04 декабря 2018

При чередовании с последним 100 используйте отрицательный прогноз для \.\d?[1-9], чтобы гарантировать, что десятичные разряды, если таковые имеются, имеют только 0 с.

Ваш первый шаблон также может соответствовать много повторяющиеся цифры перед необязательным десятичным знаком (например, 333 и 101010) из-за + в конце группы, поэтому лучше удалить +, если вы хотите совпадать только между 3 и 100.

^(?:[3-9]|[1-9][0-9]|100(?!\.\d?[1-9]))(?:\.\d{1,2})?$
                        ^^^^^^^^^^^^^^

https://regex101.com/r/tJd3LQ/1

Чтобы разрешить начальные нули, добавьте 0* сразу после ^:

^0*(?:[3-9]|[1-9][0-9]|100(?!\.\d?[1-9]))(?:\.\d{1,2})?$
 ^^
0 голосов
/ 04 декабря 2018

Проблема с этим: ^([3-9]|[1-9][0-9]|100)+(\.\d{1,2})?$ состоит в том, что также допускает 100 в первом чанке (чанк, отвечающий за разрешение целых чисел).

В вашем случае вам нужно использовать что-то вроде этого: ^100\.00$|([3-9]|[1-9][0-9])+(\.\d{1,2})?$ (Пример здесь ).

Это выражение будет пытаться сопоставить 100.00 какцелое (это ваша верхняя граница или любое другое число от 3.00 до 99.99.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...