正则表达式:验证美国邮政编码

3
我正在寻找一个正则表达式,用于验证美国邮政编码,并且不能以超过2个0开头:
例如:00979是一个有效的邮政编码(波多黎各)
但我希望用户避免输入像000979或00012这样的内容
有效的邮政编码为:979, 0979, 00979, 970, 907, 0907, 00970 ...
无效的邮政编码为:00000, 00012, 12, ...
我已经想出了
/^\d[0-9][0-9]{1,3}[1-9]([\-]\d{4})?$/

但是这并不验证979。我在这里做错了什么?我查看了其他关于验证美国邮政编码的参考资料,但是没有一个可以验证结尾为0的情况。

01234 是一个有效的输入吗? - anubhava
@anubhava:是的,这是一个有效的条目,尽管我怀疑该邮政编码是否存在,但我正在BE上进行检查。在它到达BE之前,我正在构建此正则表达式以进行FE验证。 - Shrikant Kakani
很奇怪。根据我的经验,“979”应该是一个无效的邮政编码,正确写法应该是“00979”。我不确定邮局是否会接受这种形式。但如果您已经决定允许用户省略前导零(仅适用于美国东海岸),那么我想这就是您需要做的。我的另一个问题是:您是否真的必须使用单个正则表达式来完成这个任务?如果您可以使用两个单独的测试,那将更容易和清晰。 - Keith Thompson
还有一个问题:用户能输入超过5位数字吗?如果用户的邮政编码是00979,他们能输入000979吗? - Keith Thompson
@KeithThompson:当用户输入979时,在后端代码中,我们会添加0,因此邮政编码为00979。还有许多其他有效的3位和4位邮政编码 :) 对于用户而言,用户可以输入:XXX、XXXX、XXXXX和XXXXX-XXXX。除此之外的任何内容都是无效的。 - Shrikant Kakani
显示剩余4条评论
2个回答

3

您可以使用以下正则表达式,允许在开头最多有2个零:

^(?!0{3})[0-9]{3,5}$

RegEx Demo


在查看了你的正则表达式并对其进行操作后,我发现了一些更多的边际情况,例如970、907、9790等等。但大部分情况下,你的正则表达式是有效的 :) - Shrikant Kakani
1
是的,这对大多数情况都有效。我想不到还有什么边缘情况了。我还会编辑我的问题以列出更多的边缘情况。谢谢! - Shrikant Kakani

0

你的\d不是已经过滤掉了1 [0-9]吗?

/^\d      [0-9]      [0-9]{1,3} 1-9?$/

    9       7            9       哎呀...


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