首页 > 解决方案 > 美国 Zip+4 验证

问题描述

我有一个要求提供美国 Zip+4,+4 是可选的,+4 不能是 0000。我在 .NET 中执行此操作,因此我使用带有 RegEx 集的 RegularExpressionValidator。在我的第一个验证器中,我正在检查邮政编码是 xxxxx-xxxx 还是 xxxxx 格式,即 5+4 或 5。在我的第二个验证器中,我检查最后 4 个是否未设置为 0000。这意味着 1234-0000 无效. 这些是我的正则表达式,我想确保它们是有效的。似乎他们测试正常,但是当使用 regex101 应用程序在线交叉检查它们时,我得到的行为与 .NET 不同。

xxxxx-xxxx or xxxxx = ^[0-9]{5}(?:-[0-9]{4})?$


xxxxx-0000 = \d{5}(?!-0000).*     

最后一个我完全不明白它是如何工作的,但它似乎工作。有人帮我解释一下?!和 .* 他们似乎都需要这个功能。我的理解是 .* 表示所有字符和 ?! 表示负前瞻???

标签: asp.netregex

解决方案


实际上,我在这里建议的正则表达式模式实际上是您上面提供的两者的组合:

^[0-9]{5}(?!-0000$)(?:-[0-9]{4})?$

演示

下面是对模式的解释:

^                   from the start of the ZIP code
    [0-9]{5}        match a 5 digit ZIP code
    (?!-0000$)      then assert that the PO box is NOT -0000
    (?:-[0-9]{4})?  match an optional -xxxx PO box (which can't be 0000)
$                   end of the ZIP code

值得注意的是,该(?!-0000$)术语被称为负前瞻,因为它在输入中前瞻并断言后面的不是-0000。但是,使用前瞻不会推进模式,因此在完成否定断言后,模式会继续尝试匹配-xxxx后面的可选邮政信箱。


推荐阅读