2013-08-19 16 views
7

Ho bisogno di convalidare con RegEx un valore sexagecimal, ad esempio: 24 ° 12 '55,4 "o 32 ° 24' 15,4".Gradi, minuti e secondi regex

Per ora, ho il prossimo RegEx, che corrisponde successo con gradi e minuti:

^([0-8][0-9]|[9][0])°\s([0-4][0-9]|[5][9])'$ 

Ma, quando aggiungi il validatore secondi avere problemi:

^([0-8][0-9]|[9][0])°\s([0-4][0-9]|[5][9])'\s([0-4][0-9]|[5][9],[0-9])''$ 

Sono nuovo con RegEx, qualche idea?

+0

Potresti specificare "problemi" con valori concreti che sono stati erroneamente accettati o rifiutati? Sicuramente puoi semplicemente copiarli dai tuoi test? ;) –

+0

'^ ([0-8] [0-9] | [9] [0]) ° \ s ([0-4] [0-9] | [5] [9]) '\ s ((?: [0-4] [0-9] | [5] [9]), [0-9]) '' $ 'Forse. Ma io non conosco il tuo motore. Quale lingua stai usando? – FrankieTheKneeMan

+1

Sei sicuro che '" 'è uguale a' '' '? – Brian

risposta

9

Prima di tutto, si dispone di una certa ridondanza:

^([0-8][0-9]|[9][0])°\s([0-4][0-9]|[5][9])'$ 

può diventare solo:

^([0-8][0-9]|90)°\s([0-4][0-9]|59)'$ 

successivo hai un problema di logica, nel secondo match, si sta corrispondenti 0-4 poi 0-9 (cioè 00-49) e poi di corrispondenza solo 59. È possibile modificare questo per:

^([0-8][0-9]|90)°\s[0-5][0-9]'$ 

da abbinare 00-59

Avanti diamo un'occhiata al vostro secondi modifica:

\s([0-4][0-9]|[5][9],[0-9])''$ 

Lo stesso problema di prima, solo che adesso che hai aggiunto un numero decimale, ma non a entrambi i lati della | in modo che corrisponderà solo su un lato, se possiamo risolvere questo problema, come abbiamo fissato l'ultimo otteniamo:

^([0-8][0-9]|90)°\s[0-5][0-9]'\s[0-5][0-9],[0-9]''$ 

successivo si hanno due virgolette singole invece di una doppia citazione, in modo da rimediare:

^([0-8][0-9]|90)°\s([0-5][0-9])'\s[0-5][0-9],[0-9]"$ 

Ora dobbiamo chiederci, la prima cifra è obbligatoria? Probabilmente no. Quindi contrassegnare come potenzialmente mancante utilizzando un ?

^([0-8]?[0-9]|90)°\s[0-5]?[0-9]'\s[0-5]?[0-9],[0-9]"$ 

Avanti, è la parte frazionaria del secondo obbligatoria? Probabilmente no, in modo da contrassegnare come potenzialmente mancante:

^([0-8]?[0-9]|90)°\s[0-5]?[0-9]'\s[0-5]?[0-9](,[0-9])?"$ 

Infine, sto supponendo che ogni parte tranne che per i gradi non è necessario, contrassegnarli come potenzialmente mancante:

^([0-8]?[0-9]|90)°(\s[0-5]?[0-9]')?(\s[0-5]?[0-9](,[0-9])?")?$ 

Ci sono altre cose puoi fare per migliorare questo Ma questo dovrebbe iniziare.

+0

grazie per la tua risposta e spiegaci! adesso funziona ! – ramiromd

Problemi correlati