[英]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.