代码之家  ›  专栏  ›  技术社区  ›  Pedro Silva

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

  •  3
  • Pedro Silva  · 技术社区  · 14 年前

    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 从文件中读取坐标时。如果我用一个坐标手动初始化一个变量,它会匹配得很好,但只要我从文件中读取同一行,它就不匹配了。取出 使用utf8 utf8 他在做什么。

    4 回复  |  直到 14 年前
        1
  •  1
  •   mob    14 年前

    试着放下枪 use utf8 声明。

    度符号对应于我当前编码中的字符值0xB0(不管是什么,但不是UTF8)。0xB0是UTF8中的“连续字节”;它应该由以0xC2和0xF4之间的某个字符开头的序列的第二个、第三个或第四个字符表示。用那个字符串 utf8

        2
  •  5
  •   2 revs, 2 users 90%<br/>user181548&#13; &#13;    14 年前

    这是:

    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
    
        3
  •  1
  •   daxim e.dan    14 年前

    你忘了 x 上的修饰符 qr

        4
  •  1
  •   Zaid    14 年前

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

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