邮编验证(美国邮政编码)

39

我原本以为人们会一起做一些小的代码项目,但我却没有看到他们,所以这里有一个简单的项目:

编写用于验证有效美国邮政编码的代码。我知道有ZIP代码数据库存在,但仍然有用途,例如网页快速验证,还有ZIP代码不断发行的事实,因此您可能希望使用弱验证。

我在我的wiki /博客的副项目中写了一点关于邮政编码的信息:

https://benc.fogbugz.com/default.asp?W24

还有一种新的奇怪类型的邮政编码。

https://benc.fogbugz.com/default.asp?W42

我可以完成JavaScript代码,但很有趣看到我们能够得到多少种语言。


你的博客文章指出:“ZIP + 4(10位数字)”,在说明普通邮政编码为5位数字后。我很难理解这里的数学。 - unwind
@unwind:ZIP+4实际上是10个字符,而不是10个数字。它由9个数字组成,格式为12345-6789。该页面对ZIP+4为10位数字的参考是不正确的。 - Dave Sherohman
好的,我会澄清一下。 - benc
参考那篇文章和奇怪的新邮政编码类型。我猜SHOE只是指电话按键相关数字... - Marijn Huizendveld
这些字母似乎是字面意思,因此完全符合规范的验证器要么允许字符,要么可能硬编码唯一的例外情况。我没有找到USPS的其他信息来澄清这个问题。 - benc
13个回答

54

Javascript正则表达式字面量:

美国邮编:/(^\d{5}$)|(^\d{5}-\d{4}$)/

var isValidZip = /(^\d{5}$)|(^\d{5}-\d{4}$)/.test("90210");

有些国家使用邮政编码,这将导致该模式失败。


10
你可以使用正则表达式 /(^\d{5}(-\d{4})?$/ 来代替你的测试正则表达式,这样更加简洁。在许多正则表达式引擎中,它还可以略微提高运行速度。 - Dave Sherohman
1
@Dave,你的优化中有一个错别字,缺少了最后的) - Corey Ballou
@cballou:实际上他应该删除第一个(。它是不必要的。 - mpen
1
/^\b\d{5}(-\d{4})?\b$/ 可以验证简单的5位数字邮编或者5+4位数字邮编。 - eagspoo
邮政编码 就是 邮编,只不过它的格式与大多数其他国家的不同。 - Brill Pappin
它对于“07029”无效。有什么解决方法? - ap_snitch

26
function isValidUSZip(sZip) {
   return /^\d{5}(-\d{4})?$/.test(sZip);
}

6

以下是一个基于国家代码验证邮政编码/邮政编码的JavaScript函数。它允许相对自由的格式。您还可以添加其他国家的情况。请注意,默认情况下允许空的邮政编码,因为并非所有国家都使用它们。

function isValidPostalCode(postalCode, countryCode) {
    switch (countryCode) {
        case "US":
            postalCodeRegex = /^([0-9]{5})(?:[-\s]*([0-9]{4}))?$/;
            break;
        case "CA":
            postalCodeRegex = /^([A-Z][0-9][A-Z])\s*([0-9][A-Z][0-9])$/;
            break;
        default:
            postalCodeRegex = /^(?:[A-Z0-9]+([- ]?[A-Z0-9]+)*)?$/;
    }
    return postalCodeRegex.test(postalCode);
}

FYI,第二个链接提到的虚荣邮政编码似乎是愚人节玩笑。

我非常确定你所指的是2004年的NPR报道(我刚刚找到)。第二个链接中的信息是来自2007年,我认为我读过的一篇文章实际上是来自USPS网站(我没有保存每个链接)。 - benc
我很惊讶没有人建议将加拿大邮政编码正则表达式不区分大小写。在传递到任何地方之前,可以轻松地将小写输入转换为大写。考虑用户体验! - gillytech

5

如果您是申请加拿大的话,请注意不是所有的字母都是有效的。

以下字母是无效的:D,F,I,O,Q或U。 同时字母W和Z不能用作第一个字母。 此外,一些人在第三个字符后使用一个可选的空格。

这是加拿大邮政编码的正则表达式:

new RegExp(/^[abceghjklmnprstvxy][0-9][abceghjklmnprstvwxyz]\s?[0-9][abceghjklmnprstvwxyz][0-9]$/i)

最后的i表示不区分大小写。


3

这是来自jQuery Validate插件的additional-methods.js文件中的一个例子...

jQuery.validator.addMethod("zipUS", function(value, element) {
    return /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(value);
}, "Please specify a valid US zip code.");

编辑:由于上述代码是jQuery Validate插件的一部分,它依赖于.addMethod()方法。

去除对插件的依赖并使其更加通用...

function checkZip(value) {
    return (/(^\d{5}$)|(^\d{5}-\d{4}$)/).test(value);
};

Example Usage: http://jsfiddle.net/5PNcJ/


1

1
作为一名邮寄行业从业人员,我已经工作了17年,见过各种各样的数据录入。我发现很多人并不知道他们的地址是如何被美国邮政服务定义的,这让我感到很有趣。我仍然看到像这样的地址:
XYZ学院
IT部门
城市,州 邮政编码
最糟糕的是,99%的邮件都能被投递成功,其他1%因为地址不完整而退回。
在之前的帖子中,有人提到了USPS CASS,但这个软件是收费的。
使用正则表达式来测试邮政编码是不错的选择,我正在使用表达式来确定US、CA、UK或AU邮政编码。我还看到了用于日本和其他国家的表达式,这只会增加选择正确归属国家的难度。
迄今为止,最好的解决方案是使用下拉列表来选择州和国家。然后,如果需要进一步验证,可以使用表格。仅仅是为了给你一个想法,在前5位数字上就有84052个可接受的美国城市、州和邮政编码组合。根据ISO标准,有249个有效国家,以及65个美国州/领地。
此外,还有军事、仅限PO Box和独特的邮政编码类别。在这里,KISS原则适用。

1

这是一个很好的 JavaScript 解决方案,可以解决您的验证问题:

/\b\d{5}-\d{4}\b/

0

0
为进一步回答,UPS和FedEx无法送货到PO BOX地址,必须使用USPS作为最终处理方。大多数运输软件不允许使用标准服务的PO Box邮政编码。PO Box邮政编码的例子包括00604-RAMEY,PR和06141-HARTFORD,CT。
验证邮政编码的整个需求实际上可以是一个问题,要看走多远、预算如何、时间表如何。
就像任何表达式测试一样,反复测试。我有一个州验证表达式,发现YORK被认可了,其实应该被拒绝。在成千上万次中,只有一次有人输入New York,New York 10279。
此外,请记住,USPS不喜欢标点符号,例如N. Market St.,并且对于像Lane、Place、North、Corporation等事物的可接受缩写非常具体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接