Expresión regular: rango numérico

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

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 la expresión regular pura, necesitas identificar el patrón y escribirlo:

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

Esto tiene tres alternativas: una para números de uno y dos dígitos (que permite los ceros a la izquierda), donde cada dígito puede ser cualquier cosa entre 0 y 9. Y otra que especifica qué rango de dígitos está permitido para cada dígito en tres dígitos número. 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 solo se alterna para cada rango numérico complicado que pueda haber.

No creo que Regex sea la elección correcta para esto. ¿Has intentado analizar el valor? Si tiene que usar expresiones regulares, me gustaría hacer coincidir \d{1,3} analizar la cadena y luego validar el número en el código.

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

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

La herramienta de línea de comandos rgxg recientemente lanzada genera expresiones regulares que coinciden con un rango numérico específico:

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

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

Mis dos centavos:

Cualquiera que publique una respuesta a esta pregunta debería haber probado su expresión regular con AL MENOS las siguientes entradas:

Debería coincidir: 0, 00, 000, 5, 05, 005, 95, 095, 180

NO debe coincidir: 0000, 0095, 181, 190

Creo que lo que escribió Johannes Rössel es tan bueno como lo que obtendrás:

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

Prueba esto:

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

Desglose los rangos para que pueda ser fácilmente especificado en expresiones regulares individuales por separado:

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

O lo que es lo mismo en términos legibles para los humanos:

 0
 000-099
 100-179
 180

Si necesita el rango de dos dígitos, solo se trata de agregar [0-9][0-9] a la expresión regular.

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

si no te importan 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] >> 

Puedes usar la expresión regular a continuación

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

Modifiqué Gumbo’s:

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

Trata eso.