使用Java从美国地址解析ZIP(邮政)代码

时间:2011-08-05 13:23:58

标签: java string parsing postal-code

问题是如何在字符串中检测到5个数字。 Ergo找到美国邮政编码。

旁注:我想将代码与GWT一起使用,因此正则表达式和第三方库存在限制。否则我只会使用net.sourceforge.jgeocoder

7 个答案:

答案 0 :(得分:4)

如果您打算使用正则表达式,这适用于严格格式化的ZIP: ^ \ d {5}(?[ - +] \ d {4})?$

  • 12345
  • 123456789
  • 12345-6789
  • 12345 + 6789
  • 12345-67ND(是的,你读的是正确的,有时最后两个可以是ND)

但仍有问题。某些应用程序尝试将5位ZIP解释为整数 - 例如Microsoft Excel。这意味着有时在前面有零的ZIP,例如新英格兰和波多黎各的那些,经常会出现问题。因此,您可能还需要考虑查找3位和4位数值。

美国的“第一”邮政编码为00501,是美国国税局。 (也许我们不应该允许那个验证!)当被解释为整数时,它是501.现在我们遇到了问题。

这一点很重要,因为与具有mod 10校验和的信用卡不同,地址不是自我验证的。这意味着如果没有某种外部权限,您无法知道地址是否已正确格式化和标准化。

一旦您需要通过外部机构标准化地址,您就可以验证并确认地址。

我应该提一下,我是SmartyStreets的创始人。我们有一个基于网络的address verification service,您可以通过编程方式向我们提交地址,我们会对其进行清理,对其进行标准化并对其进行验证。

答案 1 :(得分:2)

\\d{5}作为一个正则表达式我相信将是一个起点

代码:

String[] tokens = string.split("\\d{5}");  
// check token length.

从我的手机上完成,原谅拼写和语法

答案 2 :(得分:1)

对我有用的是:

(\d{5}(?=\s|$))|(\d{5}-\d{4}(?=\s|$))

答案 3 :(得分:0)

用正则表达式表达非常简单:“^ \ d {5}”

看看如何在java中实现正则表达式映射:http://www.regular-expressions.info/java.html

答案 4 :(得分:0)

使用正则表达式。

\d{5}

因为zip应位于地址的末尾

\d{5}$

答案 5 :(得分:0)

美国有两种形式的Zip。一个5位数字(称为邮政编码)和一个9位数字(称为zip +4)。以下是解析任何有效美国邮政编码的算法: 假设:起点是一个包含邮政编码(或zip + 4)候选人的字符串。

  1. 遍历输入字符串并将所有数字提取到第二个字符串,我称之为“zipString”。注意:zip +4通常写成“12345-1234”。这将删除破折号。这可能过于接受了您的目的,因为如果输入字符串是“1a2b3c4d ------- 5x”,它也会起作用。这种松散对我来说通常很好,因为它忽略了简单和可忽略的输入错误(例如“1 2345”作为邮政编码)。
  2. 如果“zipString”长度为5个字符,那就是邮政编码。
  3. 如果“zipString”长度为9个字符,则前5个字符为邮政编码,后4个字符为zip +4的+4部分。
  4. 如果“zipString”既不是5也不是9个字符,则输入无效。
  5. 仅修改为5位数的zip:

    1. 遍历输入字符串并将所有数字提取到第二个字符串,我称之为“zipString”。我更喜欢正则表达式,因为它忽略了简单且可忽略的输入错误(如“1 2345”作为邮政编码)。
    2. 如果“zipString”长度为5个字符,那就是邮政编码。
    3. 如果“zipString”长度不是5个字符,则输入无效。

答案 6 :(得分:0)

这是我用来解析地址字符串中的zipcode并将其与zipcodes数组进行比较的方法。地址字符串的格式为: 1234 Easy St,City,State 55555,USA。它还将处理拉链55555-5555

private static final Pattern pattern = Pattern.compile("\\d{5}(?:[-\\s]\\d{4})?");
private static int []zipcodes = {<your array of zips>};

public static boolean isInServiceArea(String address) {

    Matcher matcher = pattern.matcher(address);
    int zipcode = 0;
    if (matcher.find()) {
        zipcode = Integer.parseInt(matcher.group(0));
        Log.d(TAG, "zipcode: " + zipcode);
    }

    for (int code : zipcodes) {
        if (code == zipcode) {
            return true;
        }
    }
    return false;
}