Expresión regular del número decimal, donde el dígito después del decimal es opcional

Necesito una expresión regular que valida un número, pero no requiere un dígito después del decimal. es decir.

123 123. 123.4 

todo sería válido

 123.. 

Sería inválido

¡Cualquiera sería muy apreciado!

Use lo siguiente:

 /^\d*\.?\d*$/ 
  • ^ – Principio de la línea;
  • \d* – 0 o más dígitos;
  • \.? – Un punto opcional (escapado, porque en regex,. Es un personaje especial);
  • \d* – 0 o más dígitos (la parte decimal);
  • $ – Fin de la línea.

Esto permite .5 decimal en lugar de requerir el cero inicial, como 0.5

 /\d+\.?\d*/ 

Uno o más dígitos ( \d+ ), período opcional ( \.? ), Cero o más dígitos ( \d* ).

Dependiendo de su uso o motor regex, puede que necesite agregar anclajes de línea de inicio / finalización:

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

Visualización de expresión regular

Demostración de Debuggex

Necesita una expresión regular como la siguiente para hacerlo correctamente:

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

La misma expresión con espacios en blanco, usando el modificador extendido (como lo admite Perl):

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

o con comentarios:

 /^ # 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) 

Por ejemplo, coincidirá:

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

Y rechazará estos no números:

  • . (punto decimal solo)
  • -. (punto decimal negativo)
  • +. (más punto decimal)
  • (cuerda vacía)

Las soluciones más simples pueden rechazar incorrectamente números válidos o unir estos no números.

Prueba esta expresión regular:

 \d+\.?\d* 

\ d + dígitos antes del decimal opcional
.? decimal opcional (opcional debido al cuantificador?)
\ d * dígitos opcionales después del decimal

Terminé usando lo siguiente:

 ^\d*\.?\d+$ 

Esto hace que el siguiente inválido:

 . 3. 

¿Que lenguaje? En estilo Perl: ^\d+(\.\d*)?$

Creo que este es el mejor (cumple todos los requisitos): ^ \ d + (\. \ D +)? $

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

limpio y simple

Esto usa las funciones de Sufijo y Prefijo, RegEx.

Devuelve directamente verdadero - falso para la condición de IsMatch

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

Causo con esto. Admite números enteros y decimales, pero fuerza un decimal completo (números iniciales y finales) si decide ingresar un decimal.

Esto es lo que hice. Es más estricto que cualquiera de los anteriores (y más correcto que algunos):

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

Cadenas que pasa:

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

Cadenas que falla:

 . 00000 01 .0. .. 00.123 02.134 

En Perl, use Regexp :: Common que le permitirá ensamblar una expresión regular finamente ajustada para su formato de número particular. Si no está utilizando Perl, la expresión regular generada aún puede ser utilizada normalmente por otros idiomas.

Imprimir el resultado de generar las expresiones regulares de ejemplo en 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]+))|))