2012-11-13 32 views
-1

我有一个字符串从我需要提取街道,城市,州,邮编。Perl的正则表达式的字符串

字符串可能看起来

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) 

我目前使用分割功能来获得一个数组,并采取这些值做我喜欢的工作,但我希望有一个单一的正则表达式做任务的我,我将不胜感激任何帮助。 感谢

+0

您需要提供解析的精确算法 – DVK

+3

请显示您现在使用的代码。这会有很大的帮助。您定义的问题看起来很模糊。例如,您怎么知道城市名称是“盐湖城”而不是“盐湖城西部套房”,“湖城”或“城市”? – dan1111

+0

你如何确切地识别你的“街道,城市和州”? –

回答

2

地点一般是far from simple,我非常有信心,即使你找到一个适合您的测试用例,你将在一个情况下,最有可能stumple在您的正则表达式不正确匹配。

地址是非常难以解析的,因为你永远不能完全确定,什么字符串将匹配到什么部分。

有数字的城市。街道有特殊字符。唯一接近常规的是邮政编码,你可以相当安全地提取,但只有如果它总是在你的字符串的末尾。

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

+0

是弗洛里安感谢您的洞察力。我认为这样更合适。 – jnanchak

2

我同意瓦特/ 弗洛里安:一旦你得到一个正则表达式来工作,你就为大家介绍一个新的字符串,它不会工作的,你的PROG将博克。

话虽如此,这里是一个正则表达式,将在您的例子工作

#!/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"; 
} 

它不能解析城市,虽然,因为在你的地址逗号不一致。

+0

'''\ t *'可以用'\ s *'替换。 – dan1111