Сопоставление основанных на градусах географических координат с регулярным выражением - PullRequest
3 голосов
/ 30 июня 2010

Я бы хотел иметь возможность определить шаблоны формы

28°44'30"N., 33°12'36"E.

Вот что у меня есть:

use utf8;
qr{
    (?:
    \d{1,3} \s*  °   \s*
    \d{1,2} \s*  '   \s*
    \d{1,2} \s*  "   \s*
    [ENSW]  \s* \.?
            \s*  ,?  \s*
    ){2}
}x;

Само собой разумеется, это не соответствует. Имеет ли это какое-либо отношение к расширенным символам (а именно к символу степени)? Или я просто облажался?

Буду также признателен за указания CPAN, если вы знаете что-то, что решит мою проблему. Я посмотрел на Regex :: Common и Geo :: Formatter , но ничего из этого не делает то, что я хочу. Есть идеи?

Обновление

Оказывается, мне нужно было вынуть use utf8 при чтении координат из файла. Если бы я вручную инициализировал переменную с помощью координаты, она бы отлично подошла, но как только я прочитал эту же строку из файла, она не совпала бы. Вынос use utf8 решил это. Наверное, я не совсем понимаю, что делает utf8.

Ответы [ 4 ]

5 голосов
/ 30 июня 2010

Это:

use strict;
use warnings;
use utf8;
my $re = qr{
    (?:
    \d{1,3} \s*  °   \s*
    \d{1,2} \s*  '   \s*
    \d{1,2} \s*  "   \s*
    [ENSW]  \s* \.?
            \s*  ,?  \s*
    ){2}
}x;
if (q{28°44'30"N., 33°12'36"E.} =~ $re) {
    print "match\n";
} else {
    print "no match\n";
}

Работы:

$ ./coord.pl 
match
1 голос
/ 30 июня 2010

Попробуйте сбросить оператор use utf8.

Символ степени соответствует значению символа 0xB0 в моей текущей кодировке (что бы это ни было, но это не UTF8). 0xB0 - это «байт продолжения» в UTF8; ожидается, что второй, третий или четвертый символ последовательности начинается с чего-то между 0xC2 и 0xF4. Использование этой строки с utf8 приведет к ошибке.

1 голос
/ 30 июня 2010

?: в начале регулярного выражения делает его не захватывающим, поэтому, вероятно, совпадения не могут быть извлечены или просмотрены.Решение может быть исключено из регулярного выражения.

Если все координаты имеют фиксированный формат, unpack может быть лучшим способом получения желаемых значений.

my @twoCoordinates = unpack 'A2xA2xA2xAx3A2xA2xA2xA', "28°44'30"N., 33°12'36"E.";

print "@twoCoordinates";  # returns '28 44 30 N 33 12 36 E'

Если нет, то измените регулярное выражение:

my @twoCoordinates = "28°44'30"N., 33°12'36"E." =~ /\w+/g;
1 голос
/ 30 июня 2010

Вы забыли модификатор x в операторе qr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...