Expression régulière simple pour une décimale avec une précision de 2

Quelle est l'expression régulière pour une décimale avec une précision de 2 ?

Exemples valides :

123.12
2
56754
92929292929292.12
0.21
3.1

Exemples non valides:

12.1232
2.23332
e666.76

Le point décimal peut être facultatif, et les nombres entiers peuvent également être inclus.

Solution

Les jetons regex valides varient selon l'implémentation. Une forme générique est :

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

Plus compact :

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

Les deux supposent que les deux ont au moins un chiffre avant et un après la décimale.

Pour exiger que la chaîne entière soit un nombre de cette forme, il faut envelopper l'expression dans des balises de début et de fin comme (dans la forme de Perl) :

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

Pour faire correspondre des nombres sans chiffre avant la décimale (.12) et des nombres entiers ayant un point arrière (12.) tout en excluant la saisie d'un seul point (.), essayez ce qui suit :

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

Ajouté

Enveloppe la partie fractionnaire dans ()? pour la rendre optionnelle. Sachez que cela exclut des formes telles que 12. Incluant qui serait plus comme ^^d+\\\?\d{0,2}$.

Ajouté

Utilisez ^\d{1,6}(\.\d{1,2})?$ pour arrêter la répétition et donner une restriction à la partie entière de la valeur décimale.

Commentaires (17)
^[0-9]+(\.[0-9]{1,2})?$

Et comme les expressions régulières sont horribles à lire, et encore moins à comprendre, voici l'équivalent verbeux :

^                         # Start of string
 [0-9]+                   # Require one or more numbers
       (                  # Begin optional group
        \.                # Point must be escaped or it is treated as "any character"
          [0-9]{1,2}      # One or two numbers
                    )?    # End group--signify that it's optional with "?"
                      $   # End of string

Vous pouvez remplacer [0-9] par \d dans la plupart des implémentations d'expressions régulières (y compris [PCRE][1], la plus courante). J'ai laissé l'équivalent de [0-9] car je pense que c'est plus facile à lire.

Voici également le script Python simple que j'ai utilisé pour le vérifier :

import re
deci_num_checker = re.compile(r"""^[0-9]+(\.[0-9]{1,2})?$""")

valid = ["123.12", "2", "56754", "92929292929292.12", "0.21", "3.1"]
invalid = ["12.1232", "2.23332", "e666.76"]

assert len([deci_num_checker.match(x) != None for x in valid]) == len(valid)
assert [deci_num_checker.match(x) == None for x in invalid].count(False) == 0

[1] : http://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions

Commentaires (7)

Ne devrez-vous pas prendre en compte le " e " de " e666.76 " ?

Avec

(e|0-9)\d*\d.\d{1,2)
Commentaires (3)