匹配基于度的地理坐标与正则表达式

时间:2010-06-30 06:55:40

标签: regex perl coordinates

我希望能够识别表格的模式

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::CommonGeo::Formatter,但这些都不是我想要的。有什么想法吗?

更新

事实证明,当我从文件中读取坐标时,我需要取出use utf8。如果我用一个坐标手动初始化一个变量,它会很好地匹配,但是一旦我从一个文件读取同一行,它就不匹配。取出use utf8解决了这个问题。我想我真的不明白utf8正在做什么。

4 个答案:

答案 0 :(得分:5)

此:

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 :(得分:1)

您忘记了x运算符上的qr修饰符。

答案 2 :(得分:1)

尝试删除use utf8声明。

度数符号对应于我当前编码中的字符值0xB0(无论是什么,但它不是UTF8)。 0xB0是UTF8中的“连续字节”;预期序列的第二个,第三个或第四个字符以0xC2和0xF4之间的某个字符开头。将该字符串与utf8一起使用会给您一个错误。

答案 3 :(得分:1)

正则表达式开头的?:使其无法捕获,这可能是无法提取或看到匹配的原因。从正则表达式中删除它可能是解决方案。

如果所有坐标都是固定格式的,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;