RegEx匹配Perl中的多行

时间:2013-06-14 22:30:06

标签: html regex regex-greedy

我有以下需要在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个字段时做错了什么?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

你有几个问题。主要是你的正则表达式只是解析为lat而不是lon。

发生了什么变化:

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