@OrangeDog, sus coincidencias originales más de lo que podría desear. por ejemplo, 'vaca3.45tornado';)
S. Albano
39
También coincide con un solo punto que no es un número decimal válido. Una expresión regular mejor sería la /^\d*\.?\d+$/que forzaría un dígito después de un punto decimal.
Chandranshu
2
@Chandranshu y coincide con una cadena vacía, que su cambio también resolvería.
OGHaza
2
@Chandranshu "no requiere un dígito después del decimal"
OrangeDog
3
Esta solución no funciona. Requiere decimales, mientras que OP dice claramente: decimales opcionales.
Alex G
113
/\d+\.?\d*/
Uno o más dígitos ( \d+), punto opcional ( \.?), cero o más dígitos ( \d*).
Dependiendo de su uso o motor de expresiones regulares, es posible que deba agregar anclajes de línea de inicio / fin:
Sí, pero la respuesta más votada es incorrecta, coincide con ambos .y la cadena vacía.
OrangeDog
1
@Gangnus Tampoco dice que ".digit" deba coincidir. Si querían eso, deberían haberlo dicho.
OrangeDog
2
@EqualityInTech Estoy bastante seguro de que no lo es, no tiene ninguna agrupación.
OrangeDog
1
Hmm ... creo que no puedo entender completamente las expresiones regulares malignas como pensaba. Lo siento.
JDB todavía recuerda a Monica
1
@AlexanderRyanBaggett esto coincide exactamente con lo que especificó la pregunta. Como puede ver, no incluye -nada.
OrangeDog
74
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 (compatible con 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 (i.e. no extra characters remaining)/x # Extended modifier (allows whitespace & comments in regular expression)
Por ejemplo, coincidirá con:
123
23.45
34.
.45
-123
-273,15
-42.
-.45
+516
+9,8
+2.
+.5
Y rechazará estos no números:
. (punto decimal único)
-. (punto decimal negativo)
+. (más el punto decimal)
(cuerda vacía)
Las soluciones más simples pueden rechazar incorrectamente números válidos o hacer coincidir estos no números.
Mejor porque coincide con un número seguido de un punto (42). Sin embargo, hay un error / falso positivo ya que coincide con esto: 3 .... 3 que se puede solucionar agregando dos paréntesis más para hacer cumplir ^ $ caracteres de inicio y final: / ^ ([+ -]? (\ D + (\ . \ d *)?) | (\. \ d +)) $ /
Pete Alvin
1
Gracias Pete, bien visto. La respuesta ahora se ha corregido, agregando paréntesis adicionales para que se comporte como se esperaba. Ahora está escrito como ^A?(B|C)$. Anteriormente, estaba escrito como lo ^A?B|C$que en realidad significa (^A?B)|(C$)que era incorrecto. Nota: ^(A?B|C)$también es incorrecta, porque en realidad significa ^((A?B)|(C))$que no coincidiría con "+.5".
Hoylen
2
Esta es la mejor respuesta. Las otras respuestas no manejan todos los casos. Yo mismo hago algo similar, excepto que uso una búsqueda anticipada para manejar los casos de dígitos faltantes: /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$ /
PhilHarvey
1
Esa es la única expresión regular correcta aquí. Pero algunas personas no estarían de acuerdo con "34". Propondría + después de la segunda d en lugar de *
Gangnus
1
Esto también coincide con 0000.2, que probablemente no sea lo que se desea.
Aaron Zorel
11
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
Para mí, esta es la mejor respuesta, ya que la cadena: "4". (por ejemplo) no es un número válido al menos en lenguaje rubí. Sin embargo, las respuestas más votadas aceptan "4". como una expresión regular numérica, lo cual es incorrecto.
debe reflejar lo que la gente suele considerar un número decimal bien formado.
Los dígitos antes del punto decimal pueden ser de un solo dígito, en cuyo caso puede ser de 0 a 9, o más de un dígito, en cuyo caso no puede comenzar con un 0.
Si hay dígitos antes del signo decimal, entonces el decimal y los dígitos siguientes son opcionales. De lo contrario, debe haber un decimal seguido de al menos un dígito. Tenga en cuenta que se permiten varios ceros finales después del punto decimal.
Se me ocurrió esto. Permite tanto números enteros como decimales, pero fuerza un decimal completo (números iniciales y finales) si decide ingresar un decimal.
Lo que preguntaste ya está respondido, por lo que esta es solo una información adicional para aquellos que desean solo 2 dígitos decimales si se ingresa un punto decimal opcional:
^\d+(\.\d{2})?$
^: inicio de la cadena
\ d: un dígito (igual a [0-9])
+: uno y tiempos ilimitados
¿Grupo de captura (. \ D {2})?
? : cero y uno veces. : personaje .
\ d: un dígito (igual a [0-9])
{2}: exactamente 2 veces
$: final de la cadena
1: coincidencia
123: coincidencia
123.00: coincidencia
123.: no coincide
123 ...: no coincide
123.0: no coincide
123.000: no coincide
123.00.00: no coincide
@AlexanderRyanBaggett, debe verificar el signo negativo para que sea: ^ -? \ D + (\. \ D {2})? $
PersyJack
0
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 todavía puede ser utilizada por otros lenguajes.
Imprimir el resultado de generar las expresiones regulares de ejemplo en Regexp :: Common :: Number:
Respuestas:
Utilice lo siguiente:
^
- Comienzo de la línea;\d*
- 0 o más dígitos;\.?
- Un punto opcional (escapado, porque en regex,.
es un carácter especial);\d*
- 0 o más dígitos (la parte decimal);$
- Final de la línea.Esto permite 0.5 decimal en lugar de requerir el cero inicial, como 0.5
fuente
/^\d*\.?\d+$/
que forzaría un dígito después de un punto decimal.Uno o más dígitos (
\d+
), punto opcional (\.?
), cero o más dígitos (\d*
).Dependiendo de su uso o motor de expresiones regulares, es posible que deba agregar anclajes de línea de inicio / fin:
Demostración de Debuggex
fuente
.
y la cadena vacía.-
nada.Necesita una expresión regular como la siguiente para hacerlo correctamente:
La misma expresión con espacios en blanco, usando el modificador extendido (compatible con Perl):
o con comentarios:
Por ejemplo, coincidirá con:
Y rechazará estos no números:
Las soluciones más simples pueden rechazar incorrectamente números válidos o hacer coincidir estos no números.
fuente
^A?(B|C)$
. Anteriormente, estaba escrito como lo^A?B|C$
que en realidad significa(^A?B)|(C$)
que era incorrecto. Nota:^(A?B|C)$
también es incorrecta, porque en realidad significa^((A?B)|(C))$
que no coincidiría con "+.5".Prueba esta expresión regular:
fuente
123.
Creo que este es el mejor porque cumple con todos los requisitos:
fuente
Terminé usando lo siguiente:
Esto invalida lo siguiente:
fuente
.3
puedes usar esto:
partidos:
11
11,1
0,2
no coincide:
.2
2.
2.6.9
fuente
¿Que lenguaje? En estilo Perl:
^\d+(\.\d*)?$
fuente
Esto es lo que hice. Es más estricto que cualquiera de los anteriores (y más correcto que algunos):
Cuerdas que pasa:
Cuerdas que falla:
fuente
debe reflejar lo que la gente suele considerar un número decimal bien formado.
Los dígitos antes del punto decimal pueden ser de un solo dígito, en cuyo caso puede ser de 0 a 9, o más de un dígito, en cuyo caso no puede comenzar con un 0.
Si hay dígitos antes del signo decimal, entonces el decimal y los dígitos siguientes son opcionales. De lo contrario, debe haber un decimal seguido de al menos un dígito. Tenga en cuenta que se permiten varios ceros finales después del punto decimal.
coincide correctamente con lo siguiente:
así como sus equivalentes firmados, mientras que rechaza lo siguiente:
y sus equivalentes firmados, así como la cadena vacía.
fuente
limpio y sencillo.
Esto utiliza características RegEx de sufijo y prefijo.
Devuelve directamente verdadero - falso para la condición IsMatch
fuente
Se me ocurrió esto. Permite tanto números enteros como decimales, pero fuerza un decimal completo (números iniciales y finales) si decide ingresar un decimal.
fuente
Lo que preguntaste ya está respondido, por lo que esta es solo una información adicional para aquellos que desean solo 2 dígitos decimales si se ingresa un punto decimal opcional:
^: inicio de la cadena
\ d: un dígito (igual a [0-9])
+: uno y tiempos ilimitados
¿Grupo de captura (. \ D {2})?
? : cero y uno veces. : personaje .
\ d: un dígito (igual a [0-9])
{2}: exactamente 2 veces
$: final de la cadena
1: coincidencia
123: coincidencia
123.00: coincidencia
123.: no coincide
123 ...: no coincide
123.0: no coincide
123.000: no coincide
123.00.00: no coincide
fuente
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 todavía puede ser utilizada por otros lenguajes.
Imprimir el resultado de generar las expresiones regulares de ejemplo en Regexp :: Common :: Number:
fuente
prueba esto.
^[0-9]\d{0,9}(\.\d{1,3})?%?$
está probado y funcionó para mí.fuente