2013-08-19 16 views
7

Potrzebuję potwierdzić z RegEx wartością seksu, na przykład: 24 ° 12 '55,4 "lub 32 ° 24' 15,4".Stopnie, minuty i regex

Na razie mam następną RegEx, który pasuje sukces w stopniach i minutach:

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

Ale kiedy dodać walidator sekund problemy:

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

jestem nowy z RegEx, jakieś pomysły?

+0

Czy możesz określić "problemy" z konkretnymi błędnie zaakceptowanymi lub odrzuconymi wartościami? Z pewnością możesz je po prostu skopiować z testów? ;) –

+0

'^ ([0-8] [0-9] | [9] [0]) ° \ s ([0-4] [0-9] | [5] [9]) '\ s ((?: [0-4] [0-9] | [5] [9]), [0-9]) '' $ 'Może. Ale nie znam twojego silnika. Z jakiego języka korzystasz? – FrankieTheKneeMan

+1

Czy na pewno '' 'jest takie samo jak' '? – Brian

Odpowiedz

9

Po pierwsze, masz jakieś redundancję:

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

może stać się po prostu:

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

Następny masz problem logiczny, w swoim drugim meczu, jesteś wtedy dopasowanie 0-4 0-9 (czyli 00-49), a następnie dopasowanie tylko 59. można to zmienić na:

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

dopasować 00-59

Następny spójrzmy na swojej modyfikacji sekundach:

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

sam problem jak poprzednio, z wyjątkiem teraz dodasz po przecinku, ale nie do obu stronach | więc będzie pasować tylko z jednej strony, jeśli mamy rozwiązać ten problem jak my ustalona ostatni otrzymujemy:

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

Następny masz dwa apostrofów zamiast podwójny cudzysłów, więc ustalenie, że:

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

Teraz musimy zadać sobie pytanie, czy pierwsza cyfra tego obowiązkowego? Prawdopodobnie nie. Tak oznaczyć ją jako potencjalnie brakuje użyciu ?

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

Dalej, jest ułamkowa część druga obowiązkowa? Chyba nie, więc oznaczyć ją jako potencjalnie brakuje:

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

Wreszcie, jestem przy założeniu, że każda część z wyjątkiem stopni nie jest wymagana, oznaczyć je jako potencjalnie brakuje:

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

tam inne rzeczy możesz zrobić, żeby było lepiej. Ale to powinno zacząć.

+0

dziękuję za odpowiedź i wyjaśnij! teraz działa! – ramiromd