Десятичные и только положительные числовые значения - PullRequest
0 голосов
/ 22 января 2019

Какое регулярное выражение я могу использовать для положительных числовых и десятичных значений?

Accepted values: 0, 22.5 , 0.35 , 89 , .38
Invalid values : -22 , -.25 , -0.66 , abc, -22abc, 55er

Я пробовал это, но получаю ошибку

^\d*\.?\d*[1-9]+\d*$)|(^[1-9]+\d*\.\d*$"

Слишком много)

^\d*\.?\d*[1-9]+\d*$)|(^[1-9]+\d*\.\d*$

Ответы [ 5 ]

0 голосов
/ 24 января 2019
^\d*\.?\d+$

Также будет соответствовать 0,00. 0,0 0,0

0 голосов
/ 22 января 2019

Я считаю, что это регулярное выражение должно удовлетворять всем случаям и будет соответствовать только действительным образцам и отбрасывать все недействительные.

^(?:[1-9]\d*(\.\d+)?|0?\.\d+|0)$

Объяснение регулярного выражения:

  • ^ - начало строки
  • (?: - начало группы без захвата
  • [1-9]\d* - соответствует число без лишних предшествующих нулей.Будет признан недействительным 01 или 001
  • (\.\d+)? - может иметь десятичную дробь
  • | - чередование
  • 0?\.\d+ - разрешены только десятичные числа, которыенеобязательно может иметь ноль перед ними.Например, для поддержки чисел, таких как 0.11 или .11
  • | - Чередование
  • 0 - Поддержка буквального нуля в качестве особого случая
  • ) -закрытие группы без захвата
  • $ - Конец строки

Демо

0 голосов
/ 22 января 2019

Я бы просто применил ваш шаблон к этому:

\d*(?:\.\d+)?

Демо

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

Обратите внимание, что вам может потребоваться окружить шаблон якорями ^$, в зависимости от используемого вами API.

Редактировать:

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

(?=.)\d*(?:\.\d+)?

Демо

0 голосов
/ 22 января 2019

Или, если вы хотите держаться подальше от Regex, один из них может сработать:

 private static bool IsPositiveDecimal(string decimalString)
 {
     return decimal.TryParse(decimalString, out var aDecimal) && aDecimal >= 0;
 }

или

 private static bool TryParsePositiveDecimal(string decimalString, out decimal aDecimal)
 {
     return decimal.TryParse(decimalString, out aDecimal) && aDecimal >= 0;
 }

Если вы передадите последнему неположительное десятичное число, оно вернет false, но вернет проанализированный десятичный в параметре out.

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

0 голосов
/ 22 января 2019

Вы пропускаете закрывающее ) в регулярном выражении.

^\d*\.?\d*[1-9]+\d*$)|(^[1-9]+\d*\.\d*)$

Однако я настоятельно рекомендую вам взглянуть на Decimal.TryParse вместо того, чтобы пытаться проверять числа, используя формат строкисам.

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