-3

我有一个字符串,我需要从中提取 street、city、state、zip 。

字符串可能看起来像

    a)$str1  ="2500 South 3850 West Suite A Salt Lake City, UT 84120-7225";
    b)$str2 ="19701 DaVinci  Lake Forest, CA 92610";
    c)$str3="abc ,def ,ca 1234"; -->(note there are two commas in this one)

我目前正在使用 split 函数来获取一个数组并使用这些值来完成我的工作,但我想要一个正则表达式来为我完成任务。我将不胜感激。谢谢

4

2 回答 2

2

我同意弗洛里安:一旦你得到一个正则表达式工作,你就会引入一个新的字符串,它不会工作,你的编会失败。

话虽如此,这是一个适用于您的示例的正则表达式:

#!/usr/bin/perl
use strict;
use warnings;

my $addr1 = "2500 South 3850 West Suite A Salt Lake City, UT 84120-7225";
my $addr2 = "19701 DaVinci  Lake Forest, CA 92610";
my $addr3 = "abc ,def ,ca 1234";

for my $addr($addr1,$addr2,$addr3){
  $addr =~ m/^(.*),[ \t]*([a-zA-Z]{2})[ \t]([0-9\-]*)$/;
  print "\naddr : '$1'\n";
  print "state: '$2'\n";
  print "zip  : '$3'\n";
}

但是,它无法解析 City,因为您地址中的逗号不一致。

于 2012-11-13T15:40:14.743 回答
2

一般来说,位置远非简单,我非常有信心,即使您找到适合您的测试用例的位置,您也很可能会遇到正则表达式不正确匹配的情况。

地址非常难以解析,因为您永远无法完全确定,什么字符串将匹配哪个部分。

有些城市有数字。带有特殊字符的街道。唯一接近常规的是邮政编码,您可以相当安全地提取它,但前提是始终位于字符串的末尾。

除此之外,您必须将字符串与某种地址数据库进行匹配,才能知道您提取的城市/街道是否存在。

于 2012-11-13T12:08:03.690 回答