【问题标题】:Parsing ZIP (Postal) code from US address with Java使用 Java 从美国地址解析 ZIP(邮政)代码
【发布时间】:2011-10-20 21:12:34
【问题描述】:

问题是如何检测字符串中的 5 个数字。因此,查找美国邮政编码。

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

【问题讨论】:

  • 您的意思是在用户键入时进行字符串识别吗?

标签: java string parsing postal-code


【解决方案1】:

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

  • 12345
  • 123456789
  • 12345-6789
  • 12345+6789
  • 12345-67ND(是的,你没看错,有时最后两个可能是 ND)

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

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

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

一旦您需要通过外部机构对地址进行标准化,您也可以验证和确认地址。

我应该提到我是 SmartyStreets 的创始人。我们有一个基于网络的address verification service,您可以在其中以编程方式将您的地址提交给我们,我们将对其进行清理、标准化和验证。

【讨论】:

    【解决方案2】:

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

    代码:

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

    从我的手机完成,所以请原谅拼写和语法

    【讨论】:

      【解决方案3】:

      对我有用的是:

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

      【讨论】:

        【解决方案4】:

        用正则表达式表示很简单:"^\d{5}"

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

        【讨论】:

          【解决方案5】:

          使用正则表达式。

          \d{5}
          

          因为 zip 应该在地址的末尾

          \d{5}$
          

          【讨论】:

            【解决方案6】:

            在美国有两种形式的 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 位数的 zip:

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

            【讨论】:

              【解决方案7】:

              这是我从地址字符串中解析邮政编码并将其与邮政编码数组进行比较的操作。地址字符串的格式为: 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;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-12-20
                • 2013-10-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-01-27
                • 2012-03-16
                • 2010-12-07
                相关资源
                最近更新 更多