使用正则表达式解析地址

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

Han*_*s W 7

我建议你不要尝试在一个正则表达式中完成所有这些操作,因为很难验证它的正确性.

首先,我在逗号处分开.无论是逗号之后是$ town,如果没有逗号,整个字符串就是$ town.

然后我会检查是否有任何批次信息并从字符串中提取它.

然后我会寻找街道/大道的号码和名称.

分而治之:)


Sin*_*nür 7

如果这些是美国地址,请查看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'
          }
        ];