Регулярное выражение для сопоставления координат широты/долготы?

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

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

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

На этот раз будет строго соответствовать широты и долготы, которые попадают в диапазон:

^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$

Матчи

  • +90.0, -127.554334
  • 45, 180
  • -90, -180
  • -90.000, -180.0000
  • +90, +180
  • 47.1231231, 179.99999999

Не'Матч Т

  • -90., -180.
  • +90.1, -100.111
  • -91, 123.456
  • 045, 180
Комментарии (6)
Решение

Пробел - \s, а не \w

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

Посмотрим, сработает ли это

Комментарии (3)

Я использую эти (десятичном формате, с 6 десятичных цифр):

Широта

^(\+|-)?(?:90(?:(?:\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\.[0-9]{1,6})?))$

[![Широте регулярного выражения визуализации][1]][1]

Долготы

^(\+|-)?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$

[![Долготы регулярного выражения визуализации][2]][2]


[Здесь][3] - это суть, что испытания, представленные здесь, также, для облегчения доступа. Это'ы тест на Java для TestNG. Вам нужно Slf4j, Hamcrest и Ломбок, чтобы запустить его:


import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.*;

import java.math.RoundingMode;
import java.text.DecimalFormat;

import lombok.extern.slf4j.Slf4j;

import org.testng.annotations.Test;

@Slf4j
public class LatLongValidationTest {

    protected static final String LATITUDE_PATTERN="^(\\+|-)?(?:90(?:(?:\\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\\.[0-9]{1,6})?))$";
    protected static final String LONGITUDE_PATTERN="^(\\+|-)?(?:180(?:(?:\\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\\.[0-9]{1,6})?))$";

    @Test
    public void latitudeTest(){
        DecimalFormat df = new DecimalFormat("#.######");
        df.setRoundingMode(RoundingMode.UP);
        double step = 0.01;
        Double latitudeToTest = -90.0;

        while(latitudeToTest = -200.0){
            boolean result = df.format(latitudeToTest).matches(LATITUDE_PATTERN);
            log.info("Latitude: tested {}. Result (matches regex): {}", df.format(latitudeToTest), result);
            assertThat(result, is(false));
            latitudeToTest -= step;
        }

        latitudeToTest = 90.01;

        while(latitudeToTest 
Комментарии (10)

На самом деле Аликс Аксель, выше регулярное выражение неправильно в широту, долготу диапазоны точки зрения.

Измерения широты в диапазоне от -90° до +90° Измерения долготы в диапазоне от -180° до +180°

Так что регулярное выражение приведенный ниже проверяет более точно. Также, как я думал, никто не должен ограничивать десятичной точки в широту/долготу.

^([-+]?\d{1,2}([.]\d+)?),\s*([-+]?\d{1,3}([.]\d+)?)$

Или для цели c

^([-+]?\\d{1,2}([.]\\d+)?),\\s*([-+]?\\d{1,3}([.]\\d+)?)$
Комментарии (1)
^-?[0-9]{1,3}(?:\.[0-9]{1,10})?$

Срыв регулярных выражений:

^-?[0-9]{1,3}(?:\.[0-9]{1,10})?$

-? # принимать отрицательные значения

^ # Начало строки

[0-9]{1,3} # матч 1-3 цифры (я. е. 0-999)

(?: # Стараться соответствовать...

\ . # десятичной точки

[0-9]{1,10} # следуют один до 10 цифр (я. е. 0-9999999999)

)? # ...при необходимости

$ # Конец строки

Комментарии (1)

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

^(\()([-+]?)([\d]{1,2})(((\.)(\d+)(,)))(\s*)(([-+]?)([\d]{1,3})((\.)(\d+))?(\)))$

Проверьте это в:

http://regexpal.com/

Вставьте слова в верхнем поле, а затем положить вещи, как это в нижнем поле:

(80.0123, -34.034)
(80.0123)
(80.a)
(980.13, 40)
(99.000, 122.000)

Срыв регулярных выражений:

^                    # The string must start this way (there can't be anything before). 
    (\()             # An opening parentheses (escaped with a backslash).
    ([-+]?)          # An optional minus, or an optional plus.
    ([\d]{1,2})      # 1 or 2 digits (0-9).
    (                # Start of a sub-pattern.
        (            # Start of a sub-pattern.
            (\.)     # A dot (escaped with a backslash).
            (\d+)    # One or more digits (0-9).
            (,)      # A comma.
        )            # End of a sub-pattern.
    )                # End of a sub-pattern.
    (\s*)            # Zero or more spaces.
    (                # Start of a sub-pattern.
        ([-+]?)      # An optional minus, or an optional plus. 
        ([\d]{1,3})  # 1 to 3 digits (0-9).
        (            # Start of a pattern.
            (\.)     # A dot (escaped with a backslash).
            (\d+)    # One or more digits (0-9).
        )?           # End of an optional pattern.
        (\))         # A closing parenthesis (escaped with a backkslash).
    )                # End of a pattern
$                    # The string must end this way (there can't be anything after).

Теперь, что это не сделать, это ограничить себя в этом диапазоне:

(-90 to +90, and -180 to +180)

Вместо этого, он просто ограничивает себя в этот ряд:

(-99 to +99, -199 to +199) 

Но дело в основном просто, чтобы сломать каждую часть слова.

Комментарии (0)

Вот более строгая версия:

^([-+]?\d{1,2}[.]\d+),\s*([-+]?\d{1,3}[.]\d+)$
  • Широта = -90 -- +90
  • Долгота = -180 -- +180
Комментарии (2)

Питон:

Широта: результат = ре.матч (фильм"^[+-]?((90\.?0*$)|(([0-8]?[0-9])\.?[0-9]*$))&я;, '-90.00001')

Долгота: результат = ре.матч (фильм"^[+-]?((180\.?0*$)|(((1[0-7][0-9])|([0-9]{0,2}))\.?[0-9]*$))&я;, '-0.0000')

Широте должен быть не в пример.

Комментарии (0)

Я думаю, что вы используете \w (символ слова) там, где вы должны использовать \s (пробел). Словесные символы обычно состоят из [A-Za-z0-9_], так что это исключает пробел, который в дальнейшем не будет соответствовать необязательному знаку минус или цифре.

Комментарии (0)

Это будет работать для такого формата: 31 ͦ 37.4' E

^[-]?\d{1,2}[ ]*ͦ[ ]*\d{1,2}\.?\d{1,2}[ ]*\x27[ ]*\w$
Комментарии (0)

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

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

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

Комментарии (2)

Рубин

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

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

Широте -89.99999999..90

/^(-?[1-8]?\d(?:\.\d{1,8})?|90(?:\.0{1,8})?)$/ === latitude.to_s
Комментарии (0)

Полный и простой способ в Objective 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;
}

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

Комментарии (0)

На PHP

Здесь является PHP's версии (входные значения: $широты и долготы):


$latitude_pattern  = '/\A[+-]?(?:90(?:\.0{1,18})?|\d(?(?
Комментарии (0)

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

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)

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

^[-+]?(([0-8]\\d|\\d)(\\.\\d+)?|90(\\.0+)?)$,\s*^[-+]?((1[0-7]\\d(\\.\\d+)?)|(180(\\.0+)?)|(\\d\\d(\\.\\d+)?)|(\\d(\\.\\d+)?))$
Комментарии (0)
/(-?\d{1,2}[.]\d+)(?U:.*)(-?1?[0-8]?\d[.]\d+)/
Комментарии (0)