[使用Ruby(newb)和Regex,我正在尝试从街道地址解析街道号。我没有遇到麻烦的问题,但是我需要一些帮助:
''6223 1/2 S FIGUEROA ST'==>'S FIGUEROA ST'
感谢您的帮助!
更新:
''6223 1/2 2ND ST'==>'2ND ST'
来自@pesto'221B贝克街'==>'贝克街'
这将删除字符串开头的所有内容,直到碰到一个字母:
street_name = address.gsub(/^[^a-zA-Z]*/, '')
[如果有可能使用“ 221B Baker Street”之类的东西,那么您就必须使用更复杂的东西。这应该工作:
street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')
组匹配:
.*\d\s(.*)
[如果您还需要考虑公寓号:
.*\d.*?\s(.*)
将使用123A的街道名称
只要字符串中没有其他数字,那应该去除前面的数字(和空格)。只需捕获第一组(。*)
哦!除非您使用标准化地址,否则单独解析地址会非常麻烦。这样做的原因是,通常被称为门牌号的“主要号码”可以位于字符串中的各个位置,例如:
这不是一件容易的事。根据您的应用程序的需求,最好的选择是获取accurate信息是利用地址验证Web服务。有少数提供此功能的提供商。
为了全面披露,我是SmartyStreets的创始人。我们有一个address verification web service API,它将验证您的地址并使其标准化,以确保它是真实的,并允许您获取主要/门牌号码部分。非常欢迎您提出问题与我个人联系。
还有另外一个stackoverflow答案:Parse usable Street Address, City, State, Zip from a string
我认为google / yahoo解码器方法是最好的,但是取决于您所谈论的频率/许多地址-否则,选择的答案可能是最好的
街道名称也可以是数字吗?例如:
1234 45TH ST
甚至
1234 45 ST
您可以处理上述第一种情况,但第二种情况很困难。
我会将地址分割成空格,跳过任何不包含字母的前导组件,然后将其余部分合并。我不了解Ruby,但这是一个Perl示例,它也突出了我的方法的问题:
#!/usr/bin/perl
use strict;
use warnings;
my @addrs = (
'6223 1/2 S FIGUEROA ST',
'1234 45TH ST',
'1234 45 ST',
);
for my $addr ( @addrs ) {
my @parts = split / /, $addr;
while ( @parts ) {
my $part = shift @parts;
if ( $part =~ /[A-Z]/ ) {
print join(' ', $part, @parts), "\n";
last;
}
}
}
C:\Temp> skip
S FIGUEROA ST
45TH ST
ST
/[^\d]+$/
也将匹配相同的内容,除非不使用捕获组。
http://www.rubular.com/供将来参考,一个很好的正则表达式帮助工具>