0

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

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

4

7 回答 7

4

如果您要使用正则表达式,这应该适用于严格格式的 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 的创始人。我们提供基于 Web 的地址验证服务,您可以在其中以编程方式将您的地址提交给我们,我们将对其进行清理、标准化和验证。

于 2011-10-13T02:36:44.850 回答
2

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

代码:

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

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

于 2011-08-05T13:26:34.183 回答
1

对我有用的是:

(\d{5}(?=\s|$))|(\d{5}-\d{4}(?=\s|$))
于 2017-05-25T08:30:57.963 回答
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 位 zip:

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

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

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

于 2011-08-05T13:27:12.400 回答
0

用正则表达式。

\d{5}

因为 zip 应该在地址的末尾

\d{5}$
于 2011-08-05T13:28:13.523 回答
0

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