Expressão Regular: Intervalo numérico

Como você escreve uma expressão regular que corresponde a um intervalo numérico de 0 ou 000 a 180?

A maneira mais fácil para isso seria analisar a cadeia como um número e procurar o número no intervalo adequado.

Para fazer isso com regex puro, você precisa identificar o padrão e escrevê-lo:

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

Isso tem três alternativas: uma para números de um e dois dígitos (permitindo zeros à esquerda), onde cada dígito pode ser qualquer coisa de 0 a 9. E outro que especifica qual intervalo de dígitos é permitido para cada dígito em um dígito de três dígitos. número. Nesse caso, isso significa que o primeiro dígito precisa ser 1, o segundo entre 0 e 7 e o último pode ser qualquer coisa. A terceira alternativa é apenas para o número 180 que não se encheckbox bem no padrão em outro lugar.

Uma abordagem mais direta pode ser

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

que apenas alterna para cada intervalo numérico complicado pode haver.

Eu não acho que o regex é a escolha certa para isso. Você já tentou analisar o valor? Se você tiver que usar o regex, eu corresponderia à \d{1,3} analisar a string e validar o número no código.

Existe um utilitário on-line para gerá-los em UtilityMill.com Para sua pergunta, isso retorna:

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

A ferramenta de linha de comando rgxg lançada recentemente gera expressões regulares que correspondem a um intervalo de números específico:

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

Para mais informações, consulte http://rgxg.sf.net .

Meus dois centavos:

Qualquer pessoa que postar uma resposta para essa pergunta deveria ter testado sua regex com pelo menos as seguintes inputs:

Deve corresponder: 0, 00, 000, 5, 05, 005, 95, 095, 180

NÃO deve corresponder: 0000, 0095, 181, 190

Eu acho que o que Johannes Rössel escreveu é tão bom quanto você vai conseguir:

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

Tente isto:

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

Eu dividiria os intervalos para que possa ser facilmente especificado em regex individual separado:

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

Ou, o que é o mesmo em termos legíveis por humanos:

 0
 000-099
 100-179
 180

Se você precisa do intervalo de dois dígitos, é apenas uma questão de adicionar [0-9][0-9] ao regex.

Além disso, se você está tendo problemas para trabalhar com regex, tente especificá-los de uma maneira que torne os operadores regex o mais claros possível – geralmente há uma maneira de representá-los de uma maneira que torne sua function muito mais clara, especialmente se o idioma você está fazendo isso permite separar partes da especificação da regex em colunas e linhas separadas.

se você não se importa com 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] >> 

Você pode usar a expressão regular abaixo

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

Eu modifiquei o Gumbo’s:

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

Tente isso.