Expression régulière pour tout nombre supérieur à 0? [fermé]

appliquer la validation à un modèle dans MVC et voudrait le faire en utilisant Regex.

cherche à valider qu'un ID sur mon model est supérieur à 0 sur submit.

54
demandé sur Mel 2012-01-27 22:53:48

14 réponses

Je ne sais pas comment MVC est pertinent, mais si votre ID est un entier, ce BRE devrait faire:

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

si vous voulez faire correspondre des nombres réels (flotteurs) plutôt que des entiers, vous devez gérer le cas ci-dessus, avec les nombres décimaux normaux (i.e. 2.5 ou 3.3̅ ), les cas où votre modèle est entre 0 et 1 (i.e. 0.25 ), aussi bien que le cas où votre modèle a une partie décimale qui est 0. (c'est à dire 2.0 ). Et pendant que nous y sommes, nous allons ajouter le soutien pour diriger des zéros sur des entiers (i.e. 005 ):

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

notez que cette seconde est une RE prolongée. La même chose peut être exprimée en ré basique, mais presque tout comprend avant ces jours. Décomposons l'expression en parties plus faciles à digérer.

    ^(

le signe d'insertion correspond au nul au début de la ligne, donc avant votre regex avec un signe d'insertion il au début de ligne. La parenthèse d'ouverture est là à cause de la barre d'or, ci-dessous. Plus sur cela plus tard.

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

correspond à tout nombre entier ou à tout nombre de virgule flottante supérieur à 1. Donc notre 2.0 correspondrait, mais pas 0.25 . Le 0* au départ gère zéros de tête, donc 005 == 5 .

                              |

le caractère du tuyau est un " ou-bar " dans ce contexte. Pour les besoins de l'évaluation de cette expression, elle a priorité plus élevée que tout le reste, et unit effectivement deux expressions régulières ensemble. Les parenthèses sont utilisées pour grouper des expressions multiples séparées par des barres ou.

et la deuxième partie:

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

correspond à tout nombre commençant par un ou plusieurs caractères 0 (remplacer + par * pour correspondre à zéro ou plus de zéros, c.-à-d. .25 ), suivie par une période, suivi par une chaîne de chiffres qui comprend au moins un qui n'est pas un 0 . Donc ça correspond à tout au-dessus de 0 et au-dessous de 1 .

                                                    )$

et enfin, nous fermons les parenthèses et ancrons la regex à la fin de la ligne avec le signe du dollar, tout comme le caret ancre au début de la ligne.

bien sûr, si vous laissez votre langage de programmation évaluer numériquement plutôt que d'essayer de le faire correspondre à une expression régulière, vous économiserez des maux de tête et CPU.

114
répondu ghoti 2016-11-29 14:46:47

Qu'en est-il: ^[1-9][0-9]*$

12
répondu cwharris 2013-01-29 16:45:23

si vous voulez seulement des entiers non négatifs, essayez: ^\d+$

2
répondu Uila 2014-11-23 19:03:40

je pense que la meilleure solution est d'ajouter le signe + entre les deux crochets de l'expression regex:

^[1-9]+[0-9]*$
2
répondu Zaher Abou Shakra 2017-05-14 16:04:16

une autre solution:

^[1-9]\d*$

\d équivalent à [0-9]

2
répondu foxiris 2018-02-04 09:57:39

et voilà:

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

sur "soumettre":

if(myMatches.Count > 0)
{
   //do whatever you want
}
1
répondu SolidSnake 2012-01-27 19:08:43

j'ai essayé celui-ci et il a fonctionné pour moi pour tous les nombres décimaux/entiers supérieurs à zéro

permet un espace blanc: ^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$

pas d'espace blanc: ^(?=.*[1-9])\d*(?:\.\d{1,2})?$

référence: Regex supérieur à zéro avec 2 décimales

1
répondu Muhammad Omar ElShourbagy 2017-05-23 11:54:46

vous pouvez utiliser l'expression suivante:

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

entrées valides: 1 1. 1.1 1.0 tous les nombres réels positifs

entrées invalides: tous les nombres négatifs réels et 0 et 0.0

0
répondu user3571880 2014-04-25 07:35:09

la réponse est simple: ^[1-9][0-9]*$

0
répondu Md. Rousonur Jaman 2017-09-14 10:18:30

simplifié uniquement pour 2 décimales.

^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$

Réf: https://www.regextester.com/94470

0
répondu Nikhil 2018-03-23 19:55:51

je pense que cela fonctionnerait parfaitement:

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

Valide:

 1
 1.2
 1.02
 0.1 
 0.02

non valide :

0
01
01.2
1.10
-2
répondu Zota DRAGOS PETRISOR 2014-10-21 23:34:52
[1-9]\.\d{1,2}|0\.((0?[1-9])|([1-9]0?)){1,2}\b
-2
répondu Choo Hwan 2016-05-21 19:27:40

réponse très simple à cette utilisation: \d*

-7
répondu Suhail Akhtar 2012-10-14 15:25:49