Регулярное выражение для соответствия координат широты и долготы? - PullRequest
119 голосов
/ 19 августа 2010

Я пытаюсь создать регулярное выражение для сопоставления координат широты / долготы.Для сопоставления числа с двойной точностью я использовал (\-?\d+(\.\d+)?) и попытался объединить его в одно выражение:

^(\-?\d+(\.\d+)?),\w*(\-?\d+(\.\d+)?)$

Я ожидал, что это будет соответствовать двойному, запятой, возможно, некоторому пробелуеще один дубль, но это не похоже на работу.В частности, это работает только если нет места, а не один или несколько.Что я сделал не так?

Ответы [ 18 ]

2 голосов
/ 02 мая 2018

@ macro-ferrari Я нашел способ сократить его и без оглядки в свете всех недавних разговоров о двигателях регулярных выражений

const LAT_RE = /^[+-]?(([1-8]?[0-9])(\.[0-9]{1,6})?|90(\.0{1,6})?)$/;

enter image description here

const LONG_RE = /^[+-]?((([1-9]?[0-9]|1[0-7][0-9])(\.[0-9]{1,6})?)|180(\.0{1,6})?)$/;

enter image description here

0 голосов
/ 22 марта 2019

PHP

Вот версия PHP (входные значения: $latitude и $longitude):

$latitude_pattern  = '/\A[+-]?(?:90(?:\.0{1,18})?|\d(?(?<=9)|\d?)\.\d{1,18})\z/x';
$longitude_pattern = '/\A[+-]?(?:180(?:\.0{1,18})?|(?:1[0-7]\d|\d{1,2})\.\d{1,18})\z/x';
if (preg_match($latitude_pattern, $latitude) && preg_match($longitude_pattern, $longitude)) {
  // Valid coordinates.
}
0 голосов
/ 13 марта 2019

Полный и простой метод в задаче C для проверки правильности шаблона широты и долготы:

 -( BOOL )textIsValidValue:(NSString*) searchedString
{
    NSRange   searchedRange = NSMakeRange(0, [searchedString length]);
    NSError  *error = nil;
    NSString *pattern = @"^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?),\\s*[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$";
    NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: pattern options:0 error:&error];
    NSTextCheckingResult *match = [regex firstMatchInString:searchedString options:0 range: searchedRange];
    return match ? YES : NO;
}

, где seekString - это ввод, который пользователь вводит в соответствующее текстовое поле.

0 голосов
/ 11 августа 2016

Вы можете попробовать это:

var latExp = /^(?=.)-?((8[0-5]?)|([0-7]?[0-9]))?(?:\.[0-9]{1,20})?$/;
var lngExp = /^(?=.)-?((0?[8-9][0-9])|180|([0-1]?[0-7]?[0-9]))?(?:\.[0-9]{1,20})?$/;
0 голосов
/ 24 сентября 2013

Попробуйте это:

^[-+]?(([0-8]\\d|\\d)(\\.\\d+)?|90(\\.0+)?)$,\s*^[-+]?((1[0-7]\\d(\\.\\d+)?)|(180(\\.0+)?)|(\\d\\d(\\.\\d+)?)|(\\d(\\.\\d+)?))$
0 голосов
/ 02 апреля 2014
/(-?\d{1,2}[.]\d+)(?U:.*)(-?1?[0-8]?\d[.]\d+)/
0 голосов
/ 29 января 2015

рубин

Долгота -179.99999999..180

/^(-?(?:1[0-7]|[1-9])?\d(?:\.\d{1,8})?|180(?:\.0{1,8})?)$/ === longitude.to_s

Широта -89,999999999,90

/^(-?[1-8]?\d(?:\.\d{1,8})?|90(?:\.0{1,8})?)$/ === latitude.to_s
0 голосов
/ 04 декабря 2014

Попробуйте это:

(?<!\d)([-+]?(?:[1-8]?\d(?:\.\d+)?|90(?:\.0+)?)),\s*([-+]?(?:180(?:\.0+)?|(?:(?:1[0-7]\d)|(?:[1-9]?\d))(?:\.\d+)?))(?!\d)`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...