San*_*nju 1 php regex perl street-address
我必须创建一个循环,并使用正则表达式填充4个变量中的任何一个
$address, $street, $town, $lot
Run Code Online (Sandbox Code Playgroud)
循环将被输入一个字符串,其中可能包含信息,如下面的行
'123 any street, mytown' 要么'Lot 4 another road, thattown' 要么'Lot 2 96 other road, her town' 要么'this ave, this town' 要么'yourtown'因为逗号后面的任何内容都是$town我想的
(.*), (.*)
Run Code Online (Sandbox Code Playgroud)
然后可以检查第一次捕获(Lot \d*) (.*), (.*)
是否第一次捕获以一个数字开始,然后是地址(如果带有空格的$street单词),如果一个单词,它只是$town
我建议你不要尝试在一个正则表达式中完成所有这些操作,因为很难验证它的正确性.
首先,我在逗号处分开.无论是逗号之后是$ town,如果没有逗号,整个字符串就是$ town.
然后我会检查是否有任何批次信息并从字符串中提取它.
然后我会寻找街道/大道的号码和名称.
分而治之:)
如果这些是美国地址,请查看Geo :: StreetAddress :: US.
即使它们不是,该模块的来源也应该让您了解解析自由格式街道地址所涉及的内容.
这是一个处理您发布的地址的脚本(更新,早期版本将批次和数字合并为一个字符串):
#!/usr/bin/perl
use strict; use warnings;
local $/ = "";
my @addresses;
while ( my $address = <DATA> ) {
chomp $address;
$address =~ s/\s+/ /g;
my (%address, $rest);
($address{town}, $rest) = map { scalar reverse }
split( / ?, ?/, reverse($address), 2 );
{
no warnings 'uninitialized';
@address{qw(lot number street)} =
$rest =~ /^(?:(Lot [0-9]) )?(?:([0-9]+) )?(.+)\z/;
}
push @addresses, \%address;
}
use Data::Dumper;
print Dumper \@addresses;
__DATA__
123 any street,
mytown
Lot 4 another road,
thattown
Lot 2 96 other road,
her town
yourtown
street,
town
Run Code Online (Sandbox Code Playgroud)
输出:
$VAR1 = [
{
'lot' => undef,
'number' => '123',
'street' => 'any street',
'town' => 'mytown'
},
{
'lot' => 'Lot 4',
'number' => undef,
'street' => 'another road',
'town' => 'thattown'
},
{
'lot' => 'Lot 2',
'number' => '96',
'street' => 'other road',
'town' => 'her town'
},
{
'lot' => undef,
'number' => undef,
'street' => undef,
'town' => 'yourtown'
},
{
'lot' => undef,
'number' => undef,
'street' => 'street',
'town' => 'town'
}
];
| 归档时间: |
|
| 查看次数: |
1451 次 |
| 最近记录: |