Nombre décimal expression régulière, 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 décimale. c’est à dire.

123 123. 123.4 

serait tout valide

 123.. 

serait invalide

Tout serait grandement apprécié!

Utilisez le suivant:

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

Cela permet une décimale de 0,5 plutôt que de demander le zéro initial, tel que 0,5

 /\d+\.?\d*/ 

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

En fonction de votre utilisation ou du moteur d’expression rationnelle, vous devrez peut-être append des ancres de début et de fin:

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

Visualisation régulière des expressions

Debuggex Demo

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 extended (supporté par Perl):

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

ou avec des commentaires:

 /^ # Beginning of ssortingng [+-]? # 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 ssortingng (ie no extra characters remaining) /x # Extended modifier (allows whitespace & comments in regular expression) 

Par exemple, il correspondra à:

  • 123
  • 23h45
  • 34.
  • .45
  • -123
  • -273.15
  • -42.
  • -.45
  • +516
  • +9,8
  • +2.
  • +.5

Et rejettera ces non-numéros:

  • . (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 numéros valides ou correspondre à ces non-numéros.

Essayez cette regex:

 \d+\.?\d* 

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

J’ai fini par utiliser les éléments suivants:

 ^\d*\.?\d+$ 

Cela rend les invalides suivants:

 . 3. 

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

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

 (? 

propre et simple

Cela utilise les fonctions de suffixe et de préfixe, RegEx.

Il renvoie directement true - false pour la condition IsMatch

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

Je suis venu avec ça. Permet à la fois un nombre entier et décimal, mais force une décimale complète (numéros de début et de fin) si vous décidez d’entrer une décimale.

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

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

Des chaînes qui passent:

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

Chaînes qui échouent:

 . 00000 01 .0. .. 00.123 02.134 

En Perl, utilisez Regexp :: Common qui vous permettra d’assembler une expression régulière ajustée avec précision pour votre format de numéro particulier. Si vous n’utilisez pas Perl, l’expression régulière générée peut toujours être utilisée par d’autres langages.

Impression du résultat de la génération des expressions régulières d’exemple 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]+))|))