2013-05-23 9 views
6

Ho letto le domande regex su questo sito ma il mio problema sembra essere un po 'diverso. Devo abbinare un numero di 2 cifre, come 23 a 75. Lo sto facendo su un sistema Unix HP-UX. Ho trovato esempi di 3 - 44 ma di qualsiasi numero di cifre, niente di ciò che è stato risolto in lunghezza, il che è un po 'sorprendente, ma forse non capisco la risposta di esempio di lunghezza variabile.Espressione regolare: intervallo di due cifre (23-79)?

+6

Sei sicuro di voler fare un'espressione regolare qui? Sembra che la conversione in un tipo integrale seguita da un confronto tra interi potrebbe essere più appropriata. Soprattutto se la gamma può cambiare in futuro. – Paulpro

+2

Consentitemi di leggere la raccomandazione di @ Paulpro - mentre una regex * può * fare questo, è uno strumento povero (sono tentato di dire "terribile") per il lavoro. –

+0

Cosa c'è di sbagliato in '23 <= the_number <= 75'? –

risposta

7

Dato che non stai indicando se questo è in aggiunta a qualsiasi altro carattere (o nel mezzo di una stringa più grande), ho incluso la logica qui per indicare che cosa avresti bisogno di abbinare la parte numerica di un stringa. Questo dovrebbe portarti lì. Stiamo creando una gamma per i secondi numeri che stiamo cercando consentendo solo quei personaggi. Poi stiamo confrontandola con le altre gamme come or:

(2[3456789]|[3456][0-9]|7[]) 

Come Oded notato che si può fare anche questo dal sub gamme sono anche accettati (dipende l'attuazione REGEX nell'applicazione che si sta utilizzando):

(2[3-9]|[3-6][0-9]|7[0-5]) 

sulla base del titolo è necessario modificare gli ultimi 5 ad un 9 per andare 75-79:

(2[3-9]|[3-6][0-9]|7[0-9]) 

Se si sta cercando di abbinare questi numeri specificamente come st squillare (dall'inizio alla fine) quindi utilizzare i modificatori ^ e $ per indicare l'inizio e la fine della stringa.

V'è un eccellente riferimento tecnico di Regex gamme qui:

http://www.regular-expressions.info/numericranges.html

Se stai usando qualcosa come grep e cercando di confrontare le righe che contengono il numero con altri contenuti allora si potrebbe fare qualcosa di simile questo per campi thru 79:

grep "[^0-9]?(2[3-9]|[3-6][0-9]|7[0-9])[^0-9]?" folder 
+3

Potrebbe essere abbreviato a '(2 [3-9] | [3-6] [0-9] | 7 [0-5])' – Oded

+0

A destra. Ho incontrato casi in cui questo non funziona in ogni implementazione ma secondo lo standard che dovrebbe. –

+1

restituirà true se passi 2345 – SolidSnake

0

Hai due classi di numeri che si desidera abbinare:

  • la cifra 2, seguito da una delle cifre comprese tra 3 e 9
  • una delle cifre comprese tra 3 e 7, seguito da qualsiasi cifra

Edit: Beh, questa è la gamma del titolo (23-79).All'interno della vostra domanda (23-75), si dispone di tre:

  • la cifra 2, seguito da una delle cifre comprese tra 3 e 9
  • una delle cifre comprese tra 3 e 6, seguito da qualsiasi cifra
  • la cifra 7, seguito da una delle cifre comprese tra 0 e 5
+0

Quasi - fino a '75', non' 79'. – Oded

+0

@Oded L'op ha scritto 79 nell'oggetto e poi 75 nel corpo del post. Non è chiaro quale voglia davvero. – Paulpro

+0

Ci scusiamo per l'errore di battitura nell'esempio del titolo, i due numeri erano esempi, il punto chiave era solo di 2 cifre. Ma capisco cosa intendi, 79 si adatta all'intera gamma di [3-7] [0-9], il 75 era più preciso in quanto non potevo sempre riempire l'intera gamma. Pertanto, la risposta a 3 parti è ciò che stavo cercando. – user2414817

3

Questo strumento è esattamente quello che vi serve: Regex_For_Range

da 29 a 79: \b(2[3-9]|[3-7][0-9])\b

Da 29 a 75: \b(29|[3-6][0-9]|7[0-5])\b

E solo per divertimento, 192-1742: \b(19[2-9]|[2-9][0-9]{2}|1[0-6][0-9]{2}|17[0-3][0-9]|174[0-2])\b :)

+0

Al momento lo strumento ha richieste di credenziali, conosci i proprietari? – weston

+0

@weston Peccato! Li contatterò per sapere il motivo di questa autenticazione e torno da te. – sp00m

+0

Beh, se li conosci, forse potresti convincerli ad aprirlo. Pubblica su github o qui su – weston

-1

Questo dovrebbe farlo:

/^([2][3-9]|[3-6][0-9]|[7][0-5])$/ 

^ e $ renderà più rigoroso che corrisponderà solo a 2 numeri, quindi nel caso in cui si abbia i.e 234 non funzionerà.

+1

Quindi hai downgoted e copiato la mia risposta? Non fantastico –

+1

Inoltre, questo non funzionerà se usano qualcosa come 'grep' per abbinare una linea contenente i numeri che stanno cercando. –

+1

@ AbsoluteƵERØ - no il mio amico non ho votato la tua risposta. Mi ci sono voluti più di 5 minuti per testare i requisiti, quindi l'ho postato e ho solo controllato la risposta. – SolidSnake

1

Se voglio 2 cifre gamma 0-63

/^[0-9]|[0-5][0-9]|6[0-3]$/ 
  1. [0-9] permetterà singola cifra da 0 a 9
  2. [0-5] [0-9] sarà permettono 00-59
  3. 6 [0-3] permetterà da 60 sino 63

in questo modo si può prendere delle espressioni regolari per tutte le due cifre Intervallo