Regex pour correspondre à 2 chiffres, décimal facultatif, deux chiffres

J'ai passé une demi-heure à essayer d'obtenir ceci, peut-être que quelqu'un peut le trouver rapidement.

J'ai besoin d'une expression régulière qui correspondra à un ou deux chiffres, suivie d'un point décmial facultatif, suivi d'un ou deux chiffres.

Par exemple, il devrait correspondre à ces chaînes dans leur intégralité:

3
33
.3
.33
33.3
33.33

Et ne correspond à rien avec plus de 2 chiffres avant ou après le decmial point.

28
demandé sur Lightness Races in Orbit 2009-06-18 22:08:18

9 réponses

EDIT: modifié pour s'adapter à d'autres commentaires.

J'ai compris que vous vouliez dire que s'il n'y a pas de point décimal, il ne devrait pas y avoir deux chiffres de plus. Donc, cela devrait être:

\d{0,2}(\.\d{1,2})?

Cela devrait faire l'affaire dans la plupart des implémentations. Sinon, vous pouvez utiliser:

[0-9]?[0-9]?(\.[0-9][0-9]?)?

Et cela devrait fonctionner sur toutes les implémentations que j'ai vues.

51
répondu Lee 2009-06-18 18:13:33
(?<![\d.])(\d{1,2}|\d{0,2}\.\d{1,2})?(?![\d.])

Correspond:

  • Vos exemples
  • 33.

Ne correspond pas:

  • 333.33
  • 33.333
7
répondu Jeremy Stein 2009-06-18 18:32:27

Pour construire sur la réponse de Lee, vous devez ancrer l'expression pour satisfaire à l'exigence de ne pas avoir plus de 2 nombres avant la décimale.

Si chaque nombre est une chaîne distincte, vous pouvez utiliser les ancres de chaîne :

^\d{0,2}(\.\d{1,2})?$

Si chaque nombre est dans une chaîne, vous pouvez utiliser les ancres de mots :

\b\d{0,2}(\.\d{1,2})?\b
4
répondu Daniel Vandersluis 2009-06-18 18:23:10

Vous avez mentionné que vous voulez que l'expression rationnelle corresponde à chacune de ces chaînes, mais vous avez déjà mentionné que le chiffre 1-2 est avant la décimale?

Cela correspondra à 1-2 chiffres suivis d'une décimale possible, suivie d'un autre 1-2 chiffres mais échouera sur votre exemple de .33

\d{1,2}\.?\d{1,2}

Cela correspondra à 0-2 chiffres suivis d'un deciaml possible, suivi d'un autre 1-2 chiffres et correspondra à votre exemple de .33

\d{0,2}\.?\d{1,2}

Je ne sais pas exactement lequel vous cherchez.

2
répondu ahawker 2009-06-18 18:19:40
^(\d{0,2}\\.)?\d{1,2}$

\d{1,2}$ correspond à un nombre de 1-2 chiffres avec rien après (3, 33, etc.), (\d{0,2}\.)? correspond éventuellement à un nombre de 0 à 2 chiffres suivi d'un point (3., 44., ., etc.). Mettez-les ensemble et vous avez votre regex.

1
répondu pp_ 2016-02-26 06:23:47
^\d{0,2}\.?\d{1,2}$
0
répondu cpjolicoeur 2009-06-18 18:18:24

Une réponse précédente est généralement correcte, mais elle correspondra également à la chaîne vide. Ce qui suit résoudrait cela.

^([0-9]?[0-9](\.[0-9][0-9]?)?)|([0-9]?[0-9]?(\.[0-9][0-9]?))$
0
répondu 2009-06-18 20:10:36

Essayez ceci

\d{1,2}\.?(\.\d{1,2})?
0
répondu Revathi Priya 2013-06-07 12:53:15

Suivant est une très bonne expression régulière pour deux chiffres et deux points décimaux.

[RegularExpression(@"\d{0,2}(\.\d{1,2})?", ErrorMessage = "{0} must be a Decimal Number.")]
0
répondu Chetanya Pratap Singh 2013-11-06 06:20:51