簡體   English   中英

我只想捕捉第一場比賽

[英]I want to capture only the first match occurrence

我正面臨一個問題,我正在嘗試使用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))?)?

串:

梅恩大街85號主街27號

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”。

我認為您不需要[Az]類。
通過稍微減少正則表達式,您可以解決此問題:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM