我有一个使用以下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
有什么想法吗?
答案 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}$