Espressione regolare del numero decimale, in cui la cifra dopo il decimale è facoltativa

Ho bisogno di un’espressione regolare che convalidi un numero, ma non richiede una cifra dopo il decimale. vale a dire.

123 123. 123.4 

sarebbe tutto valido

 123.. 

non sarebbe valido

Qualsiasi sarebbe molto apprezzato!

Utilizza il seguente:

 /^\d*\.?\d*$/ 
  • ^ – Inizio della linea;
  • \d* – 0 o più cifre;
  • \.? – Un punto opzionale (fugato, perché in regex,. È un carattere speciale);
  • \d* – 0 o più cifre (la parte decimale);
  • $ – Fine della linea.

Ciò consente di .5 decimale anziché richiedere lo zero iniziale, ad esempio 0,5

 /\d+\.?\d*/ 

Una o più cifre ( \d+ ), periodo facoltativo ( \.? ), Zero o più cifre ( \d* ).

A seconda dell’utilizzo o del motore regex potrebbe essere necessario aggiungere ancore di inizio / fine linea:

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

Visualizzazione dell'espressione regolare

Debuggex Demo

Hai bisogno di un’espressione regolare come la seguente per farlo correttamente:

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

La stessa espressione con spazi bianchi, usando il modificatore esteso (come supportato da Perl):

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

o con commenti:

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

Ad esempio, corrisponderà:

  • 123
  • 23.45
  • 34.
  • .45
  • -123
  • -273,15
  • -42.
  • -.45
  • 516
  • 9,8
  • +2.
  • +.5

E rifiuterà questi non numeri:

  • . (punto decimale singolo)
  • -. (punto decimale negativo)
  • +. (più il punto decimale)
  • (stringa vuota)

Le soluzioni più semplici possono rifiutare erroneamente numeri validi o abbinare questi non numeri.

Prova questo regex:

 \d+\.?\d* 

\ d + cifre prima del decimale facoltativo
.? decimale facoltativo (facoltativo a causa del quantificatore?)
\ d * cifre facoltative dopo i decimali

Ho finito per usare il seguente:

 ^\d*\.?\d+$ 

Ciò rende il seguente non valido:

 . 3. 

Quale lingua? In stile Perl: ^\d+(\.\d*)?$

Penso che questo sia il migliore (corrisponde a tutti i requisiti): ^ \ d + (\. \ D +)? $

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

pulito e semplice

Questo utilizza Suffisso e Prefisso, caratteristiche RegEx.

Restituisce direttamente true - false per la condizione IsMatch

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

Sono venuto con questo. Consente sia l’intero che il decimale, ma impone un decimale completo (numeri iniziali e finali) se si decide di inserire un decimale.

Questo è quello che ho fatto. È più severo di tutti i precedenti (e più corretto di alcuni):

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

Stringhe che passano:

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

Stringhe che falliscono:

 . 00000 01 .0. .. 00.123 02.134 

In Perl, usa Regexp :: Common che ti permetterà di assemblare un’espressione regolare finemente accordata per il tuo particolare formato numerico. Se non si utilizza Perl, l’espressione regolare generata può ancora essere utilizzata in genere da altre lingue.

Stampa del risultato della generazione delle espressioni regolari di esempio in 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]+))|))