Регулярное выражение почти идеально подходит для числового значения
У меня этот 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
Ответы
Ответ 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