2012-01-27 4 views
49

Применение проверки для модели в MVC и ее использование с использованием Regex.Регулярное выражение для любого числа больше 0?

Необходимо проверить, что идентификатор моей модели больше 0 на отправке.

Я не знаком с Regex ... может кто-нибудь мне помочь?

Благодаря

+4

Почему это должно быть регулярным выражением? Это плохой инструмент для использования в этой задаче – Gareth

+5

Gareth, в некоторых случаях аналитика google позволяет использовать только регулярное выражение или точное соответствие ;-) – Skuta

ответ

104

Я не знаю, как MVC актуален, но если ваш идентификатор представляет собой целое число, это BRE должна сделать:

^[1-9][0-9]*$ 

Если вы хотите, чтобы соответствовать реальным цифрам (поплавки), а чем целые числа, вам необходимо обработать описанный выше случай, а также обычные десятичные числа (например, 2.5 или 3.3̅), случаи, когда ваш шаблон находится между 0 и 1 (то есть 0.25), а также случай, когда ваш шаблон имеет десятичную часть, которая 0. (т.е. 2.0). И в то время как мы в этом, мы добавим поддержку ведущих нулей на целых (т.е. 005):

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

Обратите внимание, что эта вторая одна является расширенной RE. То же самое можно выразить в Basic RE, но почти все понимают ERE в наши дни. Давайте разложим выражение на части, которые легче переваривать.

^(

Каретка соответствует нулю в начале строки, так что предшествующий ваше регулярное выражение с кареткой анкеры его к началу строки. Открывающая скобка находится из-за or-bar, ниже. Об этом позже.

 0*[1-9][0-9]*(\.[0-9]+)? 

Это соответствует любому целому числу или любого число с плавающей точкой выше 1. Таким образом, нашей 2.0 вошьет, но 0.25 не будет. 0* на старте обрабатывает ведущие нули, поэтому 005 == 5.

       | 

Символ трубы является «или штрих-» в этом контексте. Для оценки этого выражения он имеет более высокий приоритет, чем все остальное, и эффективно объединяет два регулярных выражения вместе. Круглые скобки используются для группировки нескольких выражений, разделенных символами or-bars.

И вторая часть:

       0+\.[0-9]*[1-9][0-9]* 

Это соответствует любому количеству, которое начинается с одного или нескольких 0 символов (заменить + с * соответствовать нулю или больше нулей, т.е. .25), за которым следует период, за которым следует по строке цифр, которая включает по меньшей мере одну, которая не является 0. Таким образом, это соответствует всем выше 0 и ниже 1.

            )$ 

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

Конечно, если вы позволите своему языку программирования оценивать что-то численно, а не пытаться сопоставить его с регулярным выражением, вы сохраните головные боли и CPU.

+1

Привет. вопрос: его проверка 123asd, 123.12kasdf –

+1

@ Vineet'DEVIN'Dev, проблема решена. (Спасибо, кстати.) RE теперь включает в себя круглые скобки, так как большинство парсеров, по-видимому, взвешивают или -бар выше нулевых якорей. – ghoti

+0

hi ghoti, могу ли я разрешить запятую в этом следующем шаблоне^(0 * [1-9] [0-9] * (\. [0-9] +)? | 0 + \. [0-9] * [ 1-9] [0-9] *) $. например, 1000.00 - 1000.00, а 12324.56 - 12.324.56 – Paresh3489227

11

Что об этом: ^[1-9][0-9]*$

+0

Вы не считаете отрицательные числа. – m0skit0

+5

@ m0skit0, и вы не рассматриваете вопрос: '' Глядя на подтверждение того, что идентификатор моей модели больше 0 на отправке. "' –

+0

Да, он ищет ** подтверждение **, ввод больше 0 с это регулярное выражение. Это не подтверждает это. Он только проверяет, что это не 0. – m0skit0

1

там вы идете:

MatchCollection myMatches = Regex.Matches(yourstring, @"[1-9][0-9]*"); 

на представить:

if(myMatches.Count > 0) 
{ 
    //do whatever you want 
} 
+0

Это не соответствует 1024. – 0605002

+0

Ответ был исправлен ... – SolidSnake

+0

Вы не рассматриваете отрицательные числа. – m0skit0

-6

Очень простой ответ на такое использование следующим образом: \ d *

+6

Это также будет соответствовать 0, 00, 000, 0000 и т. Д. – perh

-4

^\ $ ([1-9] {1} [0-9] {0,2} (\, [0-9] {3}) * ([0-9] {0,2})?.? | [1-9] {1} [0-9] {0} ([0-9] {0,2}.) |? 0 ([0-9] {0,2}.) |? (. [0-9] {1,2})?) $

+3

Не уверен, что вы хорошо прочитали вопрос. –

1

Я попробовал это один и он работал для меня для всех десятичного/целых чисел больше нуля

Позволяет пробельные: ^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$

Нет пустого пространства: ^(?=.*[1-9])\d*(?:\.\d{1,2})?$

Ссылка: Regex greater than zero with 2 decimal places

0

Вы можете использовать приведенное ниже выражение:

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

Действительные данные: 1 1. 1.1 1.0 все положительные действительные цифры

Недопустимые записи: все отрицательные действительные числа и 0 и 0.0

-2

Я думаю, что это будет прекрасно работать:

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

Действительно:

1 
1.2 
1.02 
0.1 
0.02 

недействительный:

0 
01 
01.2 
1.10 
+0

Zota, критерий в вопросе состоял в том, чтобы проверить число «* больше 0 *». Хотя я свободно признаю, что я не математик, я уверен, что все ваши «недействительные» результаты, кроме первого, будут оцениваться больше нуля. – ghoti

+0

Хорошо, скажите мне, когда был последний раз, когда вы использовали 0 перед любым другим номером, вы не считаете 01 02 03 04 ... ни 1100, потому что после нулей довольно ненужные. Я заставил свой мозг на 2 часа создайте это регулярное выражение для кого-то, кому это может понадобиться как я, и действительность относится к этому регулярному выражению ТОЛЬКО .. Спасибо за ваши отзывы, даже если это был тролль. –

+1

LOL !!! * «Скажем, 1.10 больше 0» * --- * «ЧТО Я сжимал свой мозг за 2 часа! Ты тролль!» * – Xen2050

1

Если вы хотите только неотрицательные целые числа, попробуйте: ^\d+$

-2
[1-9]\.\d{1,2}|0\.((0?[1-9])|([1-9]0?)){1,2}\b 
+3

Объяснение было бы неплохо. – cst1992

2

Я думаю, что лучшее решение будет добавить знак + между двумя скобками регулярного выражения:

^[1-9]+[0-9]*$ 
+1

Насколько вы уверены, что это делает что-то близкое к тому, чего хочет OP? И почему менее эффективный '[1-9] + [0-9] *' вместо того, что принято в принятом ответе? –

0

Простой answe г: ^[1-9][0-9]*$

+0

Какова добавленная стоимость для других ответов? – Toto

+0

Я просто ищу его для своей неотложной работы, и на этот раз моя голова была почти пуста, затем я получил этот пост, но каждый ответ здесь сложный, может для людей верхнего уровня это нужно. Но мне нужно простое решение, а не сложное. Итак, я просто добавил его, чтобы кто-то вроде меня мог получить помощь. –

+0

Это точно первая строка принятого ответа. – Toto

0

Другое решение:

^[1-9]\d*$ 

\d эквивалентно [0-9]

Смежные вопросы