如何将java String转换为邮件地址对象?

时间:2014-10-15 21:20:20

标签: java street-address data-conversion

作为输入,我得到一个字符串的地址。它可能会说"123 Fake Street\nLos Angeles, CA 99988"之类的东西。如何将其转换为具有以下字段的对象:

Address1
Address2
City
State
Zip Code

或类似的东西?如果有一个可以做到这一点的java库,那就更好了。

不幸的是,我没有选择String作为输入。它是我试图实施的规范的一部分。

输入结构不是很好,因此代码需要具有很强的容错能力。此外,地址可能来自世界各地,但100个中的99个可能在美国。

5 个答案:

答案 0 :(得分:3)

您可以使用JGeocoder

public static void main(String[] args) {
    Map<AddressComponent, String> parsedAddr  = AddressParser.parseAddress("Google Inc, 1600 Amphitheatre Parkway, Mountain View, CA 94043");
    System.out.println(parsedAddr);

    Map<AddressComponent, String> normalizedAddr  = AddressStandardizer.normalizeParsedAddress(parsedAddr); 
    System.out.println(normalizedAddr);
  }

输出将是:

{street=Amphitheatre, city=Mountain View, number=1600, zip=94043, state=CA, name=Google Inc, type=Parkway}
{street=AMPHITHEATRE, city=MOUNTAIN VIEW, number=1600, zip=94043, state=CA, name=GOOGLE INC, type=PKWY}

您可以查看其试用版的另一个库International Address Parser。它也支持国家。

AddressParser addressParser = AddressParser.getInstance();
AddressStandardizer standardizer = AddressStandardizer.getInstance();//if enabled
AddressFormater formater = AddressFormater.getInstance();

String rawAddress = "101 Avenue des Champs-Elysées 75008 Paris";

//you can try to detect the country
CountryDetector detector = CountryDetector.getInstance();
String countryCode = detector.getCountryCode("7580 Commerce Center Dr ALABAMA");
System.out.println("detected country=" + countryCode);

另外,请检查此库中的Implemented Countries

干杯!!

答案 1 :(得分:2)

我在SmartyStreets工作,我们开发地址解析和提取算法。

这很难。

如果您的大多数地址都在美国,您可以使用地址验证服务来提供有保证的准确解析结果(因为地址会根据主列表进行检查)。

有几个提供商,所以看看周围找一个适合你的提供商。由于您可能无法在本地安装数据库(不是没有大笔费用,因为地址数据由USPS许可),请查找提供REST端点的数据库,以便您可以发出HTTP请求。由于您听起来有很多地址,因此请确保API具有高性能,并允许您进行批量请求。

例如,我们的:

<强>输入:

  

13001 Point Richmond Dr NW,Gig Harbor WA

<强>输出:

Address verified

或者更具体的组件细分,如果需要:

components

如果输入更加混乱,可以使用一些地址提取服务来处理地址中的一点噪声,并解析文本中的地址并将其转换为组件。 (SmartyStreets也提供此功能,作为测试版API。我相信其他一些NLP服务也会做类似的事情。)

当然,这仅适用于美国地址。我不是英国或加拿大地址的专家,但我相信它们可能会稍微简单一些。

(除了少数几个发达国家之外,国际数据真的很难实现。可靠的数据集很难获得或不存在。但如果你真的在上 em>预算紧张,您可以为all the address formats编写自己的解析器。)

答案 2 :(得分:1)

如果您确定格式,可以使用正则表达式从字符串中获取地址。对于示例,您提供了类似这样的内容:

String address = "123 Fake Street\\nLos Angeles, CA 99988";     
String[] parts = address.split("(.*)\\n(.*), ([A-Z]{2}) ([0-9]{5})");

答案 3 :(得分:0)

我假设信息序列始终相同,因为用户永远不会在State之前输入邮政编码。如果我正确地得到你的问题,你需要逻辑来处理可能不完整的地址(比如错过一部分)。 一种方法是查找你知道正确的字符串部分。您可以将Address的已知部分视为分隔符。您将需要城市和州名称和地址单词(例如&#34; Street&#34;,&#34; Avenue&#34;,&#34; Road&#34;等)。

  1. 使用城市,州和地址字执行索引(并存储它们)。
  2. 子串并删除第一行地址(从开头到地址索引,表示单词+它的长度)。
  3. 检查城市名称的索引(在步骤1中找到的索引)。如果它是-1跳过这一步。如果它是0取出它(0也意味着地址行2不在字符串中)。如果它超过0,则将字符串从字符串的开头到城市名称的索引作为第2行地址删除。
  4. 检查州名称的索引。如果-1跳过此步骤再一次。如果0子串并切出作为州名。
  5. 您的邮政编码是什么遗留下来
  6. 检查刚刚提取的字符串,留下分隔符(逗号,点,新行等)并提取它们;
  7. 如果地址缺失州和城市,您实际上也需要一个邮政编码列表,因此最好确保用户至少输入其中一个。

    实现你需要的东西并非不可能,但你可能不想浪费所有的时间去做。确保用户正确输入所有内容更容易。

答案 4 :(得分:-4)

也许你可以使用Regular Expression