2011-08-18 14 views
5

Attualmente sto usando ([1-9]|1[0-2]) per rappresentare gli ingressi da 1 a 12. (zeri non sono ammessi.)Come rappresentare gli intervalli di numeri regolari (ad esempio da 1 a 12)?

Tuttavia sembra piuttosto hacky, e in alcuni giorni sembra titolo definitivo sporco.

☞ C'è un corretto modo incorporato per farlo?

☞ Quali sono altri modi per rappresentare gli intervalli di numeri?

+0

Se "Più grande è meglio", allora (1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 12) sarebbe meglio. – Ingo

+0

@Ingo per essere sincero che non ha attraversato i miei pensieri prima – Pacerier

+0

ma è in un certo senso la soluzione più semplice e dà un suggerimento su ciò che probabilmente vuoi: numeri del mese? – Ingo

risposta

4

tendo ad andare con forme come [2-9]|1[0-2]? che evita il backtracking, anche se qui fa poca differenza. Sono stato condizionato da XML Schema per evitare tali "ambiguità", anche se la regex può gestirle bene.

+0

Fondamentalmente, quando il matcher vede un carattere "1", il "significato" è ambiguo finché non vede più caratteri. È "1" per [1-9] o "1" per 1 [0-2]? Regex non si preoccupa del significato, ma a volte è un problema di efficienza dal momento che il matcher deve mantenere attivi entrambi i rami fino a quando l'ambiguità non viene risolta. – xan

+0

quindi stai dicendo agli occhi della macchina regex questa è la soluzione più veloce: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12? – Pacerier

+0

No, non sto confrontando '[2-9]' con '2 | 3 | 4 | 5 | 6 | 7 | 8 | 9' - non so quale sia più veloce. Sto confrontando '1 | 10' con' 10? '. Non che ciò costituisca un problema per un esempio così banale, ma per una maggiore regex, aiuterà a rimuovere i prefissi comuni dei rami. Forse un esempio migliore: 'ab | ac' migliorato a' a (b | c) '. – xan

6

È possibile utilizzare:

[1-9]|1[012] 
8

Sì, quello corretto:

[1-9]|1[0-2] 

Altrimenti non si ottiene il 10.

+0

vede la mia domanda modificata – Pacerier

Problemi correlati