Проверка ввода пользователя при наборе текста с использованием RegEx - PullRequest
1 голос
/ 09 марта 2020

Я изо всех сил пытаюсь написать RegEx для следующих критериев:

  • Число может быть положительным / отрицательным
  • Необязательно - в начале
  • Между 1 и 5 цифр перед десятичной точкой
  • только 2 десятичных знака (необязательно)
  • Не разрешать пользователю вводить больше 1. или -

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

^((-?[0-9]{1,5}(\.?){1,1}[0-9]{0,2})

Это должно позволить пользователю вводить следующие цифры.

-1.12
12345
1
123
12.12

Буду признателен за любую помощь!

Ответы [ 3 ]

1 голос
/ 09 марта 2020

Если вы хотите проверить при вводе, вы можете использовать дополнительные группы для принятия промежуточных значений и сделать окончательную проверку всего шаблона при обработке значения.

^-?(?:\d{1,5}(?:\.\d{0,2})?)?$

Объяснение

  • ^ Начало строки
  • -? Необязательный дефис
  • (?: Группа без захвата
    • \d{1,5} Соответствие 1-45 цифр
    • (?: Группа без захвата
      • \.\d{0,2} Совпадение с точкой и цифры 0-2
    • )? Закрыть группу и сделайте его необязательным
  • )? Закройте группу и сделайте его необязательным
  • $ Конец строки

Regex демо

Чтобы проверить окончательный шаблон, вы можете сопоставить необязательные -, 1-5 цифр и необязательную десятичную часть:

^-?\d{1,5}(?:\.\d{1,2})?$

Regex demo

1 голос
/ 10 марта 2020

Вы можете использовать

^-?\d{0,5}(?:(?<=\d)\.\d{0,2})?$

См. Демоверсию regex .

Подробности

  • ^ - начало строки
  • -? - необязательно -
  • \d{0,5} - от нуля до пяти цифр
  • (?:(?<=\d)\.\d{0,2})? - необязательная последовательность
    • (?<=\d) - должен быть ди git непосредственно слева от текущего местоположения
    • \. - точка
    • \d{0,2} - ноль, один или две цифры
  • $ - конец строки.
1 голос
/ 09 марта 2020

Регулярное выражение ^(-?(\d{1,5}(\.\d{0,2})?)?)$ должно работать, если вы хотите сопоставить строки, оканчивающиеся на ., такие как 123. демо этого регулярного выражения

В противном случае измените 0 до 1 следующим образом: ^(-?(\d{1,5}(\.\d{1,2})?)?)$. Тогда он будет соответствовать только строкам, которые имеют ди git после десятичной точки.

Регулярное выражение, которое вы разместили, разрешает строки с более чем 2 цифрами после десятичной точки, потому что оно прекращает сопоставление после 2 цифр, даже если строка продолжается. Добавление $ в конце регулярного выражения останавливает его для сопоставления строк, которые продолжаются после части, которую мы хотим.

Это регулярное выражение ^(-?\d{1,5}(\.\d{0,2})?)$ будет проверять ввод, как только пользователь закончит ввод, потому что я предполагаю, что Вы не хотите, чтобы - был действительным в этот момент.

...