2011-12-22 14 views
17

Necesito un RegEx para un valor numérico con hasta dos decimales mayor que cero y puede o no tener un cero en la columna de las unidades. También debería agregar ... los números enteros están bien. Ver somments a continuación, pero no puede haber espacios iniciales o finales blancosRegex mayor que cero con 2 lugares decimales

Good values: 
.1 
0.1 
1.12 
123.12 
92 
092 
092.13 

Error values: 
0 
0.0 
0.00 
00 
1.234 
-1 
-1.2 
Anything less than zero 
+0

sólo para comprobar: cifras decimales no debe contener '0' y puede variar de 1' -2' lugares o '0-2' lugares? (o en otras palabras: ¿es opcional la parte '.nn'? – Regexident

+0

sí ... la parte .nn es opcional. Así que se permiten números enteros. Lo agregué a la pregunta. THx – MikeTWebb

+0

¿Dónde se encuentran los números? ¿son el único contenido de una cadena, o encerrados en espacios en blanco? Esto es crucial para que coincida con '92' y similares. – Regexident

Respuesta

40

¿Qué tal esto:

^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$ 

Explicación:

^   # Start of string 
\s*   # Optional whitespace 
(?=.*[1-9]) # Assert that at least one digit > 0 is present in the string 
\d*   # integer part (optional) 
(?:   # decimal part: 
\.   # dot 
\d{1,2}  # plus one or two decimal digits 
)?   # (optional) 
\s*   # Optional whitespace 
$   # End of string 

prueba en Python:

>>> import re 
>>> test = [".1", "0.1", "1.12", "123.12", "92", "092", "092.13", "0", "0.0", "0.00", "00", "1.234", "-1", "-1.2"] 
>>> r = re.compile(r"^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$") 
>>> for item in test: 
...  print(item, "matches" if r.match(item) else "doesn't match") 
... 
.1 matches 
0.1 matches 
1.12 matches 
123.12 matches 
92 matches 
092 matches 
092.13 matches 
0 doesn't match 
0.0 doesn't match 
0.00 doesn't match 
00 doesn't match 
1.234 doesn't match 
-1 doesn't match 
-1.2 doesn't match 
+0

Este es el camino a seguir. Tener ese voto positivo – Regexident

+0

Eso es muy cerca. Lo único que no es t all ow es .9 sin cero de lectura. Al usuario no le gusta tener que escribir el cero. – MikeTWebb

+0

+1 - ¡y me gusta mucho su estilo de comentarios! 8 ^) – ridgerunner

1

[0-9]+\.[0-9]{1,2}

que encontrarán:

  • al menos un número
  • Un punto decimal
  • Uno o dos dígitos después del punto decimal.
+1

Esto permite 0.0 y no permite números enteros. –

+0

También permite '0.00' (incorrectamente) y no permite' .1' (incorrectamente) – AjahnCharles

1

/^[0-9]*(\.{1})?([0-91-9][1-9])?$/

probar esto pasa todos los casos

+0

Esto (incorrectamente) no coincide '.1',' 0.1' y (incorrectamente) coincide con '0',' 00' – AjahnCharles

-3

Esta expresión no permitirá ningún espacio en blanco comienzo y el último

/^\d*(?:\.\d{1,2})*$/ 
+0

Esto coincide con: '0',' 0.0', '0.00',' 00' (todos de los cuales fueron casos de prueba negativos dados en la pregunta). – AjahnCharles

+0

^(([1-9] + ([.] [0-9] {1,3})?) | (0 [.] [0-9] {2} [1-9])) $ think esto ma la condición –

+0

El nuevo patrón en su comentario (incorrectamente) no coincide con '.1',' 0.1', '092',' 092.13', y (incorrectamente) coincide con '1.234' – AjahnCharles

Cuestiones relacionadas