2012-06-06 24 views
7

que necesitan una expresión expresión regular que concuerda lo siguiente:números y decimales coincidentes expresiones regulares

.5 
0.5 
1.5 
1234 

pero NO

0.5.5 
absnd (any letter character or space) 

tengo esto que satisfaga a todos, pero 0.5.5

^[.?\d]+$ 
+0

La mejor respuesta, en lugar de un artículo de investigación está aquí: https://stackoverflow.com/a/39399503/715269 – Gangnus

Respuesta

18

Esta es una tarea bastante común. La forma más sencilla que conozco para tratar con él es la siguiente:

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

También hay otras complicaciones, tales como si desea permitir ceros o comas o cosas por el estilo que lleva. Esto puede ser tan complicado como quieras que sea. Por ejemplo, si desea permitir que el formato 1,234,567.89, se puede ir con esto:

^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$ 

Eso \b hay una ruptura palabra, pero lo estoy usando como una forma disimulada para requerir al menos un número en el final de la cadena. De esta forma, una cadena vacía o un solo + no coincidirá.

Sin embargo, tenga en cuenta que expresiones regulares no son la forma ideal para analizar cadenas numéricas. Todos los lenguajes de programación modernos que conozco tienen métodos rápidos, simples e incorporados para hacerlo.

+1

+1 para el "método incorporado", párrafo – niko

+0

¿Le importaría compartir el infractor? –

+0

Parece que tenemos un troll alrededor de estas partes. También recibí downvoted. –

1

Esto podría funcionar:

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

Esto requiere un punto decimal. –

+0

Sí, estoy haciendo coincidir \ d * entre paréntesis, no \ d + – niko

+0

Parece correcto ahora. Comenté antes de agregar el '?'. –

3

El siguiente debería funcionar:

^(?!.*\..*\.)[.\d]+$ 

Este utiliza un búsqueda negativa hacia delante para asegurarse de que hay menos de dos . caracteres de la cadena.

http://www.rubular.com/r/N3jl1ifJDX

+0

Sin embargo, esto se repite dos veces. –

+0

¿Por qué querrías hacerlo tan complicado? –

+3

Tyler y Justin: estoy de acuerdo en que su método es mejor, pero dejaré esto como una alternativa. El método de búsqueda anticipada es bueno para verificar varias condiciones como esta (por ejemplo, en la validación de contraseñas), pero complica algo tan simple como este, ¡disfrute de un +1! –

10

Nadie parece estar representando los números negativos. Además, algunos están creando un grupo de captura que no es necesario. Esta es la solución más completa de la OMI.

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

EDITAR: ¿Por qué el voto a favor?

+0

Me parece bien, tener un voto favorable. –

+2

* se estira para un apretón de manos * –

2

Aquí es una solución mucho más simple que no utiliza ningún look-aheads o buscar-traseros:

^\d*\.?\d+$ 

Para entender claramente por qué esto funciona, lee de derecha a izquierda:

  • Se requiere al menos un dígito al final.
    7 obras
    77 obras
    .77 obras
    0.77 obras
    0. no funciona
    cadena vacía no funciona
  • Un único período que precede el dígito es opcional .
    .77 obras
    77 obras
    ..77 no funciona
  • cualquier número de dígitos anteriores al período (opcional). .77 obras
    0.77 trabaja
    0077.77 obras
    0077 obras

No usar look-aheads y buscar-culos tiene la ventaja añadida de no tener que preocuparse por los ataques DOS basado en expresiones regulares.

HTH

Cuestiones relacionadas