164 votes

Expression régulière de nombre décimal, où le chiffre après la décimale est facultatif

J'ai besoin d'une expression régulière qui valide un nombre, mais qui ne nécessite pas de chiffre après la décimale. Par exemple.

123
123.
123.4

seraient toutes valables

123..

ne serait pas valable

Toute information serait grandement appréciée !

0 votes

La meilleure réponse est ici : stackoverflow.com/a/39399503/715269

265voto

João Silva Points 36619

Utilisez les éléments suivants :

/^\d*\.?\d*$/
  • ^ - Début de la ligne ;
  • \d* - 0 ou plusieurs chiffres ;
  • \.? - Un point facultatif (échappé, car dans regex, . est un caractère spécial) ;
  • \d* - 0 ou plusieurs chiffres (la partie décimale) ;
  • $ - Fin de la ligne.

Cela permet d'obtenir une décimale de 0,5 au lieu d'exiger le zéro initial, comme 0,5.

2 votes

@OrangeDog, votre original correspond à plus de choses qu'il n'en faut, par exemple 'cow3.45tornado' ;)

0 votes

@S. Albano, la regex originale d'OrangeDog, \d+\.?\d* aurait correspondu à "3.45" dans "cow3.45tornado" !

0 votes

Oui, ce que je voulais dire, c'est que ce n'est peut-être pas un comportement souhaité, compte tenu de la série d'exemples donnés par Trish. OrangeDog a ensuite ajouté la deuxième regex, ce qui a permis d'améliorer sa réponse et de la faire correspondre à celle de João, qui obtenait les votes positifs.

150voto

OrangeDog Points 7380
/\d+\.?\d*/

Un ou plusieurs chiffres ( \d+ ), période optionnelle ( \.? ), zéro ou plusieurs chiffres ( \d* ).

En fonction de votre utilisation ou du moteur regex, vous devrez peut-être ajouter des ancres de début et de fin de ligne :

/^\d+\.?\d*$/

Regular expression visualization

Démonstration de Debuggex

13 votes

Oui, mais la réponse la plus votée est fausse, elle correspond aux deux. . et la chaîne vide.

0 votes

Mais votre réponse ne prend PAS ".1", c'est un nombre décimal correct !

0 votes

@Gangnus la question a une définition étrange de "nombre décimal". Ma réponse est la réponse correcte à la question.

94voto

Hoylen Points 3842

Vous avez besoin d'une expression régulière comme la suivante pour le faire correctement :

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

La même expression avec des espaces, en utilisant le modificateur étendu (tel que supporté par Perl) :

/^  [+-]? ( (\d+ (\.\d*)?)  |  (\.\d+) ) $/x

ou avec des commentaires :

/^           # Beginning of string
 [+-]?       # Optional plus or minus character
 (           # Followed by either:
   (           #   Start of first option
     \d+       #   One or more digits
     (\.\d*)?  #   Optionally followed by: one decimal point and zero or more digits
   )           #   End of first option
   |           # or
   (\.\d+)     #   One decimal point followed by one or more digits
 )           # End of grouping of the OR options
 $           # End of string (i.e. no extra characters remaining)
 /x          # Extended modifier (allows whitespace & comments in regular expression)

Par exemple, il correspondra :

  • 123
  • 23.45
  • 34.
  • .45
  • -123
  • -273.15
  • -42.
  • -.45
  • +516
  • +9.8
  • +2.
  • +.5

Et rejettera ces non-nombres :

  • . (point décimal unique)
  • -. (point décimal négatif)
  • +. (plus le point décimal)
  • (chaîne vide)

Les solutions les plus simples peuvent rejeter à tort des numéros valides ou faire correspondre ces non-numéros.

2 votes

Le meilleur parce qu'il correspond à un nombre suivi d'un point (42.). Cependant, il y a un bug/faux positif car il correspond à ceci : 3....3 qui peut être corrigé en ajoutant deux parenthèses supplémentaires pour renforcer les caractères de début et de fin de ^$ : /^([+-] ?( \d +( \.\d *) ?)|( \.\d +))$/

2 votes

Merci Pete, bien vu. La réponse a maintenant été corrigée, en ajoutant des parenthèses supplémentaires pour qu'elle se comporte comme prévu. Elle s'écrit maintenant comme suit ^A?(B|C)$ . Auparavant, il était écrit comme ^A?B|C$ ce qui signifie en fait (^A?B)|(C$) ce qui était incorrect. Note : ^(A?B|C)$ est également incorrect, car il signifie en fait ^((A?B)|(C))$ qui ne correspondrait pas à "+.5".

2 votes

C'est la meilleure réponse. Les autres réponses ne traitent pas tous les cas. Je fais moi-même une chose similaire, sauf que j'utilise un lookahead pour gérer les cas de chiffres manquants : /^[+-] ?(?= \d | \.\d ) \d *( \.\d *)?$/

20voto

Kash Points 3540

Essayez cette regex :

\d+\.?\d*

\d + chiffres avant la décimale facultative
. ? optionnel décimal (optionnel à cause du quantificateur ?)
\d * chiffres optionnels après la décimale

1 votes

Non, celui-là ne correspond pas 123.

1 votes

Merci pour la note. J'ai modifié mon regex.

6 votes

En effet, mais maintenant vous venez de l'éditer dans ce qui est déjà posté par quelqu'un d'autre. Considérez que vous venez de supprimer encore une autre réponse "correcte".

2voto

Luis Points 831

Quelle langue ? Dans le style Perl : ^\d+(\.\d*)?$

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X