Подтвердить что ты не робот

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

У меня этот REGEX почти совершенный... Кажется, что он обрабатывает все, кроме числа, которое ведет с отрицательным знаком, а затем десятичным. Поэтому, если я вхожу:

-.2

Я получаю сообщение об ошибке -

Вот мое Regex - все, что я проверил, отлично работает...

^(\+|-)?[0-9]{1,11}?(?:\.[0-9]{1,4})?$

Это позволяет:

  • число до 11 цифр (99 миллиардов)
  • положительное или отрицательное число
  • до 4 знаков после запятой (необязательно)
  • ведущий 0 до десятичной точки не является обязательным - только для положительных чисел

Все эти работы:

-0.2345
-10
12
.125
0.1245
5.555
25000000000 (aka 25 Billion)
25000000000.25 

Они не работают:

-.2
-.421
4b9b3361

Ответ 1

Попробуйте следующее:

^(\+|-)?[0-9]{0,11}?(?:\.[0-9]{1,4})?$

Update:

Вышеупомянутое регулярное выражение принимает строки +, - и (пустая строка). Вы можете использовать lookahead для их ограничения. Внешний вид гарантирует, что символ должен быть после знака + или -.

Правильное решение:

^(\+|-)?(?=.{1})[0-9]{0,11}(?:\.[0-9]{1,4})?$

Рабочий пример:

Принимаемые строки:

-0.2345
-10
12
.125
0.1245
5.555
-.2
-.421

Строки не принимаются:

100000000000.0001
+
-

123456789012
1111111111.12345
+1.11.1
-2.

Ответ 2

Regex может быть дорогостоящим... Почему бы не использовать Decimal.Parse или Float.parse?

Ваша текущая реализация никогда не будет работать с альтернативными стилями чисел, например, в Европе. (точка) и (запятая) взаимозаменяемы... тогда как Decimal.Parse будет:

string stringValue = "45.889,33";
CultureInfo currentCulture = Thread.CurrentCulture; //set this way up in the execution chain
decimal thenumber = Decimal.Parse(stringValue, currentCulture);
//thenumber = 45889.33 in us-en display format.

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

Ответ 3

Как насчет этого плохого мальчика:

^(\+|-)?([0-9]{1,11}?|)(?:\.[0-9]{1,4})?$

Кажется, работает =)

Ответ 4

My $.02

 ^(\+|-)?([0-9]{1,11}|)?(?:\.[0-9]{1,4})?$

Ответ 5

Ключевое слово: 0 является необязательным только для POSITIVE.

Вам нужны отдельные операторы для положительных и отрицательных.

^(((\+?[0-9]{0,11})|(-[0-9]{1,11}))(?:\.[0-9]{1,4})*)$

Ответ 6

Все ваши проблемы можно решить с помощью границы слова в нужном месте:

^(?:\+|-\b)?[0-9]{0,11}(?:\.[0-9]{1,4})?\b$
  • Изменен {1,11} на {0,11}, чтобы до десятичной точки доходить до нулей.
  • \b после того, как минус sigh не позволит сразу после него десятичную точку.
  • \b в конце не позволит "+" или "-" как целую строку.

Рабочий пример (адаптирован от Джона): http://rubular.com/r/c7YLR25r3i