我只想捕捉第一场比赛

时间:2019-03-04 21:19:58

标签: regex perl

我正面临一个问题,我试图使用perl和regex从给定的字符串中提取特定格式的地址。我希望只能捕获匹配的第一个匹配项,但是,它一直保持多个匹配项。这使我无法从字符串中提取第一个匹配项,因为我似乎无法弄清楚如何使用perl来引用第一个匹配项。

正则表达式:

((\d+[A-z]?(\s+\d\/\d)?|lot\s+\d+[A-z]?|apt\s+\d+[A-z]?)\s+[A-z]+\s+[A-z]+(\s+(avenue|street|road|drive))?)?

字符串:

  

5月27日主要街道邮政信箱85号

Perl函数:

sub hashaddress($)
{
    my $string = shift;

    if ($string =~ /\s?((\d+[A-z]?(\s+\d\/\d)?|lot\s+\d+[A-z]?)\s+[A-z]+\s+[A-z]+(\s+(avenue|street|road|drive))?)?/gi)
    {
        $string =~ /\s?((\d+[A-z]?(\s+\d\/\d)?|lot\s+\d+[A-z]?)\s+[A-z]+\s+[A-z]+(\s+(avenue|street|road|drive))?)?/gi;
        $string = $1;
    }

    return $string;
}

当我想要的是第一个匹配项“ 27 MAIN STREET”时,perl函数将返回“ 85 MAY PEN”。

1 个答案:

答案 0 :(得分:2)

我认为您不需要[A-z]类。
通过稍微减少正则表达式,您可以解决此问题:

sub hashaddress
{
    my ($string) = @_;

    if ( $string =~ /(?i)((\d+[a-z]?(\s+\d\/\d)?|lot\s+\d+[a-z]?)\s+[a-z]+\s+[a-z]+(\s+(avenue|street|road|drive))?)/ ) {  
        return $1;
    }
    return $string;
}

正则表达式信息:

 (?i)                          # Case insensitive
 (                             # (1 start)
      (                             # (2 start)
           \d+ [a-z]? 
           ( \s+ \d / \d )?              # (3)
        |  lot \s+ \d+ [a-z]? 
      )                             # (2 end)
      \s+ [a-z]+ \s+ [a-z]+ 
      (                             # (4 start)
           \s+ 
           (                             # (5 start)
                avenue 
             |  street
             |  road
             |  drive 
           )                             # (5 end)
      )?                            # (4 end)
 )                             # (1 end)