2009-09-04 15 views
27

Come si scrive un'espressione regolare che corrisponde a un intervallo numerico da 0 o 000 a 180?Espressione regolare: intervallo numerico

+1

http://www.regular-expressions.info/numericranges.html è un articolo molto utile – Bergi

+0

io credo che si possa utilizzare questo pacchetto 'https: // github.com/dimka665/gamma-regex'. Supporta già valori negativi. Il codice corrente non è aggiornato, quindi dovrai scaricarlo da quella risorsa github. – swdev

risposta

28

Il modo più semplice per farlo sarebbe quello di analizzare la stringa come un numero e cercare il numero nell'intervallo corretto.

di fare questo con puro regex è necessario identificare il modello e lo scrive:

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

Questo ha tre alternative: uno per i numeri mono e due cifre (che consente zeri iniziali), dove ogni cifra può essere qualsiasi cosa da 0 a 9. E un altro che specifica quale intervallo di cifre è consentito per ogni cifra in un numero di tre cifre. In questo caso, ciò significa che la prima cifra deve essere 1, la seconda tra 0 e 7 e l'ultima può essere qualsiasi cosa. La terza alternativa è solo per il numero 180 che non si adattava bene al modello altrove.

Un approccio più diretto potrebbe essere

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

che alterna solo per ogni intervallo numerico difficile potrebbe verificarsi.

+0

questo fa il trucco. come anche detto che ha da abbinare 3 numeri a due cifre come 001, 010, 012 e così via, che questo non. Grazie! – Morten

2

Prova questa:

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

Né per una "000" tripla. –

+0

@Ionut G. Stan: Penso che sia solo l'alternativa se abbinare solo numeri senza zero iniziali è troppo difficile. – Gumbo

32

Non credo regex è la scelta giusta per questo. Hai provato a analizzare il valore? Se si deve usare regex, corrispondere allo \d{1,3} analizzare la stringa e quindi convalidare il numero nel codice.

+8

+1 Le altre risposte hanno almeno un bug ciascuna, ecco perché non vale la pena usare RE per queste attività. – soulmerge

+3

due bug ancora :(ma sì, io fondamentalmente sono d'accordo. – Joey

+1

In ogni altro contesto sarebbe stato più facile da analizzare un valore, ma è utilizzato in una regex più grande che passa una coordinata come 54 ° 11'56.234 '' – Morten

0

Ho modificato Gumbo di:

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

provare che.

0

se non si cura di numeri negativi

>> 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

C'è un'utility online per generare questi at UtilityMill.com Per la vostra domanda, questo ritorna:

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

come regola generale, non avrei fiducia in una regex scritto da un programma Le mie esperienze con RegexBuddy hanno dimostrato che non è il mio "amico", né è possibile scrivere espressioni regolari decenti –

+0

Questo è co giusto, però. Sebbene consenta arbitrariamente molti zeri iniziali. – Joey

+0

@ paul-mcguire è possibile ignorare le virgole se l'utente tenta di inserire valori come 1.000? – Vyache

1

vorrei rompere le catene così che può essere facilmente specificato in singole espressioni regolari:

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

Oppure, che cosa è la stessa in termini leggibili:

 
0 
000-099 
100-179 
180 

Se avete bisogno della gamma a due cifre, è solo una questione di aggiungere [0-9][0-9] per l'espressione regolare.

Inoltre, se si hanno problemi a lavorare con regex, cercare di specificarli in un modo che rende gli operatori regex più chiaro possibile - di solito c'è un modo per rappresentare loro in un modo che rende la loro funzione molto più chiaro, specialmente se la lingua che stai facendo in questo ti permette di separare parti della specifica regex in colonne e linee separate ..

+0

Hai dimenticato una sola cifra da 1 a 9. –

+0

No, ho appena letto "0 o 000 a 180" e interpretato per significare: 0 come una cifra o l'intervallo da 000 a 180 come tre cifre. Quando ho detto "Se hai bisogno dell'intervallo di due cifre ..." avrei dovuto menzionare anche l'intervallo di una cifra, quindi in merito a ciò sei corretto. – lcv

3

I miei due centesimi:

chiunque invii una risposta a questa domanda dovrebbe hanno testato la loro espressione regolare con almeno i seguenti ingressi:

deve corrispondere: 0, 00, 000, 5, 05, 005, 95, 095, 180

non dovrebbe corrispondere: 0000, 0095, 181, 190

Penso che quello che Johannes Rössel ha scritto è quanto di meglio si possa ottenere:

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

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

13

La recente pubblicazione rgxg strumento a riga di comando genera le espressioni regolari che corrispondono a una serie numero specifico:

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

Per ulteriori informazioni, vedere http://rgxg.sf.net.

0

È possibile utilizzare l'espressione regolare sotto

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

Se hai bisogno esattamente di tre cifre, puoi rimuovere? segni –