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

时间:2009-10-13 11:56:21

标签: regex

我有一个使用以下Regex验证英国邮政编码的应用程序。

(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})

如果我正确理解此正则表达式,则允许的邮政编码应为此邮政编码:

GIR 0AA

或者我们可以按如下方式编写邮政编码的第一部分:

要么

ANN (where A is any letter except for QVX and N is any number)

ABNN (where A is any letter except for QVX, B any letter except for IJZ and N is any number)

ANC (where A is any letter except for QVX, N is any number and C is any letter from A-H and then J, K, S, T, U, W)

ABND (where A is any letter except for QVX, B any letter except for IJZ, N is any number and D can be any of ABEHMNPRVWXY)

邮政编码的第二部分是

NEE (where N is any number and E is any letter except for any of CIKMOV)

这是我对上述正则表达式的理解。

我无法理解的是它允许aaa1 1aa or aaa11 1aa

的原因

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您尚未将其锚定到字符串的开头和结尾(^和$)

^((GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2}))$

答案 1 :(得分:3)

除了锚定之外:我不知道你正在使用什么正则表达式方言,但我从来没有遇到过这种语法:

[A-Z-[QVX]]

排除了你想要的字符QVX。在大多数正则表达式中,它将是允许A-Z-[的字符类,后跟一个文字的紧密方括号。要排除QVX,您必须说:

[A-PR-UWYZ]

无论如何,彻底“验证”邮政编码通常不是一个好主意;邮政编码是一种比大多数人想象的更野蛮的野兽,特别是如果你想允许历史邮政编码和奇怪的东西,如BFPO邮政编码(你现在似乎忽略了)。如果邮局添加新代码,您也不希望更新代码。

最好使用简单的粗略检查来明显错误/缺少输入;确实拒绝潜在客户是件坏事,因为你认为他们的地址是“无效的”。

答案 2 :(得分:0)

使用此正则表达式

^ ?(([BEGLMNSWbeglmnsw][0-9][0-9]?)|(([A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][0-9]?)|(([ENWenw][0-9][A-HJKSTUWa-hjkstuw])|([ENWenw][A-HK-Ya-hk-y][0-9][ABEHMNPRVWXYabehmnprvwxy])))) ?[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$