регулярное выражение, чтобы разрешить ввод только до 3 десятичных знаков с 0,001 является наименьшее возможное число, а не 0 - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь написать регулярное выражение, чтобы позволить пользователю вводить положительное число с точностью до 3 десятичных знаков.Мое регулярное выражение выглядит следующим образом, однако оно не работает так, как мне бы хотелось.

/\d*[1-9](\.\d{0,3})?/

Это позволяет пользователю вводить 1.000 как наименьшее число, однако не позволяет пользователю0.001

Кто-нибудь знает, каким должно быть регулярное выражение для решения этой проблемы?

Ответы [ 6 ]

0 голосов
/ 27 февраля 2019

const tests = ["0.001", "0.1", "0","0.0", "0.000","10.001", "10","11","1","1.22","1.222"]
tests.forEach(n => console.log(parseFloat(n) >= 0.001))

Я действительно думаю, что это обдумывается.

0 голосов
/ 26 февраля 2019

Другой вариант - использовать отрицательный прогноз, чтобы утверждать с начала строки, что справа не является ни точкой, ни нулем, повторяемым до конца строки:

^(?![0.]+$)\d+(?:\.\d{1,3})?$

См. Regex demo

Пояснение

  • ^ Начало строки
  • (?![0.]+$) Отрицательный взгляд вперед, чтобы утверждать, чтосправа - это не то, что указано в классе символов, повторенное 1+ раз до конца строки
  • \d+ Соответствие 1+ раз цифре
  • (?:\.\d{1,3})? Необязательный не захватгруппа, которая соответствует точке и 1+ раз цифры
  • $ Конец строки
0 голосов
/ 26 февраля 2019

const re = /^(?!0+(?:\.0+)?$)\d+(?:\.\d+)?$/
const tests = ["0.001", "0.1", "0","0.0", "0.000","10.001", "10","11","1","1.22","1.222"]
tests.forEach(n => console.log(n, re.test(n)))

Объяснение:

^               # beginning of string
  (?!           # negative lookahead, make sure we haven't after:
    0+          # 1 or more zero
    (?:         # start non capture group
      \.        # a dot
      0+        # 1 or more zero
    )?          # end group, optional
    $           # end of string
  )             # end lookahead
  \d+           # 1 or more digits
  (?:           # start non capture group
    \.          # a dot
    \d+         # 1 or more digits
  )?            # end group, optionnal
$               # end of string
0 голосов
/ 26 февраля 2019

В вашем коде есть еще одна проблема, из-за которой он не может совпадать с 10, поскольку вы не допускаете, чтобы места для них были равны 0.

Вам необходимо использовать некоторые операторы или операторы

const re = /(^([1-9]|\d{2,})(\.\d{0,3})?|0\.\d{0,2}[1-9])$/
const tests = ["0.001", "0.1", "0","0.0", "0.000","10.001", "10","11","1"]
tests.forEach(n => console.log(n, re.test(n)))
0 голосов
/ 26 февраля 2019

Лично я бы просто проверил на 0 и сделал бы регулярное выражение намного проще, но вот решение, где требуемые десятичные разряды можно изменить, изменив {1,3}.

Суть этогорегулярное выражение заключается в том, что мы допускаем любое число больше двух цифр, затем разрешаем только 1-9 для одной цифры, а затем необязательно требуем до 1 десятичного знака с 1-3 цифрами впоследствии.

const r = /^((([0-9]{2,}){1}|[1-9]{1})(\.[0-9]{1,3}){0,1})$/;
const tests = ['1','2','0','1.001','1.001.1','999.001','9.01','9.0100','abc'];
tests.forEach(t=>console.log(t,r.test(t)));
0 голосов
/ 26 февраля 2019

Ответ здесь.

([1-9]\.[0-9][0-9][0-9]|[0]\.[1-9][0-9][0-9]|[0]\.[0][1-9][0-9]|[0]\.[0][0][1-9])

Это должно соответствовать 0,001 ~ 9,999

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