Próbuję utworzyć wyrażenie regularne do dopasowania współrzędnych szerokości / długości geograficznej. Aby dopasować liczbę o podwójnej precyzji, której użyłem (\-?\d+(\.\d+)?)
i próbowałem połączyć ją w jedno wyrażenie:
^(\-?\d+(\.\d+)?),\w*(\-?\d+(\.\d+)?)$
Spodziewałem się, że to pasuje do podwójnego, przecinka, może trochę spacji i innego podwójnego, ale wydaje się, że nie działa. W szczególności działa tylko wtedy, gdy NIE ma miejsca, ani jednego ani więcej. Co zrobiłem źle?
Ten będzie ściśle dopasowany do wartości szerokości i długości geograficznej, które mieszczą się w poprawnym zakresie:
mecze
Nie pasuje
źródło
?:
składni grupy nie przechwytującej, a także polaryzacji przechwytywania(^[-+]?(?:[1-8]?\d(?:\.\d+)?|90(?:\.0+)?)),\s*([-+]?(?:180(?:\.0+)?|(?:(?:1[0-7]\d)|(?:[1-9]?\d))(?:\.\d+)?))$
Używam tych (format dziesiętny, z 6 cyframi dziesiętnymi):
Szerokość
Długość geograficzna
Oto streszczenie, które testuje oba, opisane tutaj, pod kątem łatwości dostępu. To test Java TestNG. Potrzebujesz Slf4j, Hamcrest i Lombok, aby go uruchomić:
źródło
Właściwie Alix Axel, powyższe wyrażenie regularne jest błędne w zakresie szerokości i długości geograficznej.
Zakres pomiarów szerokości geograficznej wynosi od –90 ° do + 90 ° Pomiary długości geograficznej wahają się od –180 ° do + 180 °
Zatem wyrażenie regularne podane poniżej sprawdza się dokładniej.
Ponadto, zgodnie z moją myślą, nikt nie powinien ograniczać miejsca dziesiętnego w szerokości / długości geograficznej.
LUB dla celu C
źródło
99
zaLatitude
, podczas gdy99
jest poza zakresem,-90, +90
a więc nieważne.Podział Regex:
-?
# akceptuje wartości ujemne^
# Początek ciągu[0-9]{1,3}
# Dopasuj 1-3 cyfry (np. 0-999)(?:
# Spróbuj dopasować ...\.
# przecinek dziesiętny[0-9]{1,10}
#, po którym następuje od jednej do 10 cyfr (np. 0-9999999999))?
# ...opcjonalnie$
# Koniec ciąguźródło
Spróbuj tego:
Sprawdź to na:
http://regexpal.com/
Wklej wyrażenie w górnym polu, a następnie umieść takie rzeczy w dolnym polu:
Podział Regex:
To, czego to NIE robi, to ograniczenie się do tego zakresu:
Zamiast tego po prostu ogranicza się do tego zakresu:
Ale chodzi głównie o rozbicie każdego fragmentu wyrażenia.
źródło
Oto bardziej rygorystyczna wersja:
-90
-+90
-180
-+180
źródło
Pyton:
Szerokość:
result = re.match("^[+-]?((90\.?0*$)|(([0-8]?[0-9])\.?[0-9]*$))", '-90.00001')
Długość geograficzna:
result = re.match("^[+-]?((180\.?0*$)|(((1[0-7][0-9])|([0-9]{0,2}))\.?[0-9]*$))", '-0.0000')
W tym przykładzie usługa Latitude powinna zawieść.
źródło
@ macro-ferrari Znalazłem sposób, aby to skrócić i bez patrzenia w przyszłość w świetle wszystkich ostatnich rozmów o silnikach regex
źródło
Uważam, że używasz \ w (znak słowa), w którym powinieneś używać \ s (spacji). Znaki słów zazwyczaj składają się z [A-Za-z0-9_], więc wyklucza to twoją spację, która następnie nie pasuje do opcjonalnego znaku minus lub cyfry.
źródło
To zadziała dla formatu takiego: 31 ͦ 37,4 'E
źródło
Rubin
Długość geograficzna -179.99999999..180
Szerokość geograficzna -89,999999999..90
źródło
Kompletna i prosta metoda sprawdzania poprawności wzoru szerokości i długości geograficznej w celu C to:
gdzie ciąg szukany jest danymi wejściowymi, które użytkownik wprowadziłby w odpowiednim polu tekstowym.
źródło
PHP
Oto wersja PHP (wartości wejściowe to:
$latitude
i$longitude
):źródło
Możesz spróbować tego:
źródło
Spróbuj tego:
źródło
Spróbuj tego:
źródło