我正面临一个问题,我试图使用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”。
答案 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)