web-dev-qa-db-fra.com

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

Appliquer la validation à un modèle dans MVC et aimerait le faire avec Regex.

Cherche à valider qu'un identifiant sur mon modèle est supérieur à 0 lors de la soumission.

56
Lando

Je ne sais pas en quoi MVC est pertinent, mais si votre identifiant est un entier, ce BRE devrait le faire:

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

Si vous souhaitez faire correspondre des nombres réels (flottants) plutôt que des entiers, vous devez gérer la casse ci-dessus, ainsi que des nombres décimaux normaux (c.-à-d. 2.5 ou 3.3̅), dans les cas où votre modèle est compris entre 0 et 1 (c.-à-d. 0.25). au cas où votre modèle comporte une partie décimale égale à 0. (c.-à-d. 2.0). Et pendant que nous y sommes, nous ajouterons un support pour les zéros non significatifs sur les entiers (à savoir 005):

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

Notez que ce second est un RE étendu. La même chose peut être exprimée dans Basic RE, mais presque tout comprend ERE ces jours-ci. Décomposons l’expression en parties plus faciles à digérer.

    ^(

Le curseur correspond au caractère nul situé au début de la ligne. Ainsi, votre regex précédant votre regex est ancré au début de la ligne. La parenthèse ouvrante est là à cause de l’or-barre ci-dessous. Plus sur cela plus tard.

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

Cela correspond à tout nombre entier ou tout nombre à virgule flottante supérieur à 1. Ainsi, notre 2.0 serait apparié, mais 0.25 ne le serait pas. Le 0* au début gère les zéros non significatifs, donc 005 == 5.

                              |

Le caractère de pipe est un " ou une barre " dans ce contexte. Aux fins de l'évaluation de cette expression, elle a une priorité plus élevée que tout le reste et relie efficacement deux expressions régulières. Les parenthèses sont utilisées pour regrouper plusieurs expressions séparées par des barres obliques.

Et la deuxième partie:

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

Cela correspond à tout numéro commençant par un ou plusieurs caractères 0 (remplacez + par * pour qu'il corresponde à zéro ou plus, c.-à-d. .25), suivi d'un point, suivi d'une chaîne de chiffres qui en contient au moins un autre que 0. Donc, cela correspond à tout ce qui se trouve au-dessus de 0 et au-dessous de 1.

                                                    )$

Et enfin, nous fermons les parenthèses et ancrons l'expression régulière à la fin de la ligne avec le signe dollar, tout comme le curseur s'ancre au début de la ligne.

Bien sûr, si vous laissez votre langage de programmation évaluer quelque chose 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.

117
ghoti

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

13
cwharris
3
Eduardo Cuomo

Si vous ne voulez que des entiers non négatifs, essayez: ^\d+$

2
Uila

Je pense que la meilleure solution consiste à ajouter le signe + entre les deux crochets de l'expression rationnelle:

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

Une autre solution:

^[1-9]\d*$

\d équivalent à [0-9]

2
foxiris

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

Permet l'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

voilà:

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

sur soumettre:

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

Vous pouvez utiliser l'expression ci-dessous:

(^\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 réels négatifs et 0 et 0.0

0
user3571880

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

0
Md. Rousonur Jaman

Simplifié seulement pour 2 décimales. 

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

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

0
Nikhil