2009-09-04 55 views
27

¿Cómo se escribe una expresión regular que coincida con un rango numérico de 0 o 000 a 180?Expresión regular: rango numérico

+1

http://www.regular-expressions.info/numericranges.html es un artículo muy útil – Bergi

+0

Creo que se puede utilizar este paquete 'https: // github.com/dimka665/range-regex'. Ya admite valores negativos. El código actual no está actualizado, por lo que deberá descargarlo de ese recurso github. – swdev

Respuesta

28

La forma más fácil de hacerlo sería analizar la cadena como un número y buscar el número en el rango adecuado.

Para hacer esto con expresiones regulares pura que necesita para identificar el modelo y escribirlo:

^(0?[0-9]{1,2}|1[0-7][0-9]|180)$ 

Esto tiene tres alternativas: una para los números de uno y dos dígitos (permitiendo ceros a la izquierda), donde cada el dígito puede ser cualquier cosa desde 0 hasta 9. Y otro que especifica qué rango de dígitos está permitido para cada dígito en un número de tres dígitos. En este caso, esto significa que el primer dígito debe ser 1, el segundo entre 0 y 7 y el último puede ser cualquier cosa. La tercera alternativa es solo para el número 180, que no encajaba bien en el patrón de otros lugares.

Un enfoque más directo podría ser

^(0{0,2}[0-9]|0?[1-9][0-9]|1[0-7][0-9]|180)$ 

que acaba alterna para cada rango numérico complicado que pudiera haber.

+0

Esto también funciona: como también lo mencionó tiene que coincidir con los números de 3 dígitos como 001, 010, 012 y así sucesivamente. ¡Gracias! – Morten

2

Prueba esto:

^(0|[1-9][0-9]?|1[0-7][0-9]|180)$ 
+0

Ni por un triple '000'. –

+0

@Ionut G. Stan: Creo que esa es la alternativa si emparejar solo números sin ceros a la izquierda es demasiado difícil. – Gumbo

32

no creo expresión regular es la mejor opción para esto. ¿Has intentado analizar el valor? Si tiene que usar expresiones regulares, me correspondería con \d{1,3} analizar la cadena y luego validar el número en el código.

+8

+1 Las otras respuestas tenían al menos un error cada una, es por eso que no vale la pena usar RE para estas tareas. – soulmerge

+3

Dos errores incluso :(pero sí, estoy totalmente de acuerdo. – Joey

+1

En cualquier otro contexto podría haber sido más fácil analizar un valor, pero se usa en una expresión regular más grande que pasa una coordenada como 54 ° 11'56.234 '' – Morten

0

he modificado Gumbo de:

^(00?0?|0?[1-9][0-9]?|1[0-7][0-9]|180)$ 

probar eso.

0

si no se preocupan por los números negativos

>> r = /\b(0?\d?\d|1[0-7]\d|180)\b/ 
=> /\b(0?\d?\d|1[0-7]\d|180)\b/ 
>> (0..200).map {|i| i.to_s =~ r } 
=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] 
>> 
18

Hay una utilidad en línea para generar estos at UtilityMill.com Por su pregunta, esto devuelve:

0*([0-9]{1,2}|1[0-7][0-9]|180) 
+0

Como regla general, no confiaría en una expresión regular escrito por un programa. Mis experiencias con RegexBuddy han demostrado que no es mi "amigo", ni puede escribir expresiones regulares decentes. –

+0

Este es co correcto, sin embargo. Aunque permite arbitrariamente muchos ceros a la izquierda. – Joey

+0

@ paul-mcguire ¿es posible ignorar las comas si el usuario intenta ingresar valores como 1,000? – Vyache

1

Me gustaría romper los rangos tan que se puede especificar fácilmente en regex individual por separado:

^(0|0[0-9][0-9]|1[0-7][0-9]|180)$

O lo que es lo mismo en términos legibles:

 
0 
000-099 
100-179 
180 

Si necesita el rango de dos dígitos, es sólo una cuestión de añadir [0-9][0-9] a la expresión regular.

Además, si tiene problemas para trabajar con regex, intente especificarlos de manera que los operadores de expresiones regulares sean lo más claros posible; generalmente hay una manera de representarlos de una manera que hace su función mucho más clara, especialmente si el idioma en el que está haciendo esto le permite separar partes de la especificación de expresiones regulares en columnas y líneas separadas.

+0

Olvidó un solo dígito del 1 al 9. –

+0

No, acabo de leer "0 o 000 a 180" e interpretó que significa: 0 como un dígito , o el rango de 000 a 180 como tres dígitos. Cuando dije "Si necesitas el rango de dos dígitos ..." también debería haber mencionado el rango de un dígito, por lo que estás en lo cierto. – lcv

3

Mis dos centavos:

persona que publique una respuesta a esta pregunta debería haber puesto a prueba su expresión regular con al menos las siguientes entradas:

debe coincidir: 0, 00, 000, 5, 05, 005, 95, 095, 180

NO debe coincidir: 0000, 0095, 181, 190

creo que lo Johannes Rössel escribió es casi tan bueno como te:

^(0?[0-9]{1,2}|1[0-7][0-9]|180)$ 
+1

PowerShell ayuda a validar: '-20..200 |% {$ _;" {0:00} "- f $ _;" {0: 000} "- f $ _} |% {if ($ _- match "^ (0? [0-9] {1,2} | 1 [0-7] [0-9] | 180) $") {Write-Host -fore green $ _} else {Write-Host - fore red $ _}} ' – Joey

13

La herramienta recientemente publicado rgxg línea de comandos genera expresiones regulares que coinciden con una serie específica de números:

$ rgxg range -Z 0 180 
(180|1[0-7][0-9]|0?[0-9]{1,2}) 

Para obtener más información, véase http://rgxg.sf.net.

0

Se puede utilizar el siguiente expresión regular

^([0-1]?[0-7]?[0-9])|180$ 
+0

Si lo necesita exactamente tres dígitos, ¿puede eliminarlo? señales –