我希望能够识别表格的模式
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
正在做什么。
答案 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;