web-dev-qa-db-fra.com

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

J'ai besoin d'une expression régulière qui valide un nombre, mais ne nécessite pas de chiffre après la virgule. c'est à dire.

123
123.
123.4

serait tout valide

123..

serait invalide

Tout serait grandement apprécié!

88
Trish

Utilisez le suivant:

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

Cela permet d’utiliser une valeur décimale de 0,5 plutôt que d’exiger le zéro initial, tel que 0,5.

166
João Silva
/\d+\.?\d*/

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

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

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

Regular expression visualization

Démo Debuggex

100
OrangeDog

Vous avez besoin d'une expression régulière comme celle-ci pour le faire correctement:

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

La même expression avec des espaces, en utilisant le modificateur étendu (comme 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, cela correspondra à:

  • 123
  • 23h45
  • 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 plus simples peuvent rejeter de manière incorrecte des nombres valides ou faire correspondre ces non-nombres.

65
Hoylen

Essayez cette regex:

\d+\.?\d*

\ d + chiffres avant décimal optionnel
.? décimal optionnel (facultatif en raison du? quantificateur)
\d * chiffres facultatifs après le signe décimal

8
Kash

J'ai fini par utiliser ce qui suit:

^\d*\.?\d+$

Cela rend invalide ce qui suit:

.
3.
4
Charles Naccio

Je pense que c'est le meilleur (correspond à toutes les exigences): ^\d + (\.\D +)? $

3
Luca Manzo

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

3
Luis

C'est ce que j'ai fait. C'est plus strict que tout ce qui précède (et plus correct que certains):

^0$|^[1-9]\d*$|^\.\d+$|^0\.\d*$|^[1-9]\d*\.\d*$

Cordes qui passe:

0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34

Des chaînes qui échouent:

.
00000
01
.0.
..
00.123
02.134
2
Xiaohang James Miao
^\d+(()|(\.\d+)?)$

Entré avec ça. Autorise les nombres entiers et décimaux, mais force une décimale complète (nombres de début et de fin) si vous décidez d'entrer une décimale.

1
cvanniekerk

vous pouvez utiliser ceci:

^\d+(\.\d)?\d*$

allumettes:
11
11.1
0,2

ne correspond pas:
. 2
2.
2.6.9

1
Ahmed Abdulkafy
(?<![^d])\d+(?:\.\d+)?(?![^d])

propre et simple.

Ceci utilise les fonctions Suffix et Prefix, RegEx.

Il renvoie directement true - false pour la condition IsMatch

1
Prashant P

En Perl, utilisez Regexp :: Common qui vous permettra d’assembler une expression régulière précisément adaptée à votre format numérique. Si vous n'utilisez pas Perl, l'expression régulière générée peut toujours être utilisée par d'autres langues.

Imprimer le résultat de la génération des exemples d'expressions régulières dans Regexp :: Common :: Number:

$ Perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))

$ Perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

$ Perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))
0
pndc

Vous avez déjà répondu à ce que vous avez demandé. Il ne s'agit donc que d'une information supplémentaire pour ceux qui ne veulent que deux chiffres décimaux si la virgule décimale facultative est entrée:

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

^: début de la chaîne
\d: un chiffre (égal à [0-9])
+: une et plusieurs fois

Groupe de capture (.\D {2})?
? : zéro et une fois. : personnage .
\d: un chiffre (égal à [0-9])
{2}: exactement 2 fois
$: fin de la chaîne

1: match
123: match
123.00: match
123. : aucune concordance
123 ..: pas de correspondance
123.0: pas de correspondance
123.000: pas de correspondance
123.00.00: pas de correspondance

0
PersyJack