【问题标题】:RegEx match for multiline in PerlPerl中多行的RegEx匹配
【发布时间】:2013-06-14 22:30:06
【问题描述】:

我有以下需要在 Perl 中解析的数据行:

  my $string='Upper Left  (  440720.000, 3751320.000) (117d38\'28.21"W, 33d54\'8.47"N)';

这是我的 perl 脚本:

  if ($string=~ m/Upper Left\s+[(]\s+\d{1,6}[.]\d{1,3}[\,]\s+\d{1,6}[.]\d{1,3}[)]\s+[(](\d{1,3})d(\d{1,2})['](\d{1,2})[.](\d{1,2})/ig) {
    $upperLeft="lat=". $1. 'd'. $2. "'". $3. ".". $4. '"W long='. $5. 'd'. $6. "'". $7. ".". $8. '"W';
    print $upperLeft. "\n";
   }

但是,这个表达式不能 117d38'28.21" 作为 lat 和 33d54'8.47 一样长。注意我用来创建这个正则表达式的输入 $string 中的空格和 '('。

在将 (117d38'28.21"W, 33d54'8.47"N) 提取到 8 个字段时我做错了什么?任何帮助表示赞赏。

【问题讨论】:

    标签: html regex regex-greedy


    【解决方案1】:

    您遇到了几个问题。主要是你的正则表达式只是解析到纬度,而不是经度。

    发生了什么变化:

    m/Upper Left\s+[(]\s+\d{1,6}[.]\d{1,3}[\,]\s+\d{1,6}[.]\d{1,3}[)]\s+[(](\d{1,3})d(\d{1,2})['](\d{1,2})[.](\d{1,2})/ig
    m/Upper Left\s+[(]\s+\d{1,6}[.]\d{1,3}[\,]\s+\d{1,7}[.]\d{1,3}[)]\s+[(](\d{1,3})d(\d{1,2})['](\d{1,2})[.](\d{1,2})"([WE])[\,]\s(\d{1,3})d(\d{1,2})['](\d{1,2})[.](\d{1,2})"([NS])/ig
                                                      ^-- Your test number was 7-digit big                             ^-- (1)     ^-- (2)                                     ^-- (3)
    

    在结尾处:(1)新增组处理W/E([WE]))。 (2) 增加分组提取lon号码。 (3) 新增群组处理N/S(([NS]))。

    您的代码,已更正:

    if ($string=~ m/Upper Left\s+[(]\s+\d{1,6}[.]\d{1,3}[\,]\s+\d{1,7}[.]\d{1,3}[)]\s+[(](\d{1,3})d(\d{1,2})['](\d{1,2})[.](\d{1,2})"([WE])[\,]\s(\d{1,3})d(\d{1,2})['](\d{1,2})[.](\d{1,2})"([NS])/ig) {
        $upperLeft = "lat=" . $1 . 'd' . $2 . "'" . $3 . "." . $4 . '"' . $5 . " long=" . $6 . 'd' . $7 . "'" . $8 . "." . $9 . '"' . $10;
        print $upperLeft. "\n";
    }
    

    输出:

    lat=117d38'28.21"W long=33d54'8.47"N
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      相关资源
      最近更新 更多