2009-10-13 7 views
0

J'ai une application qui utilise le Regex suivant pour valider les codes postaux du Royaume-Uni.Regex pour valider les codes postaux du Royaume-Uni

(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}) 

Si je comprends regex correctement les codes post autorisés doivent être soit ce code postal:

GIR 0AA 

Ou alors nous pouvons composer la première partie du code postal comme suit:

Soit

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

ou

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

ou

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) 

ou

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) 

La deuxième partie du code postal est

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

Ceci est ma compréhension de l'expression rationnelle ci-dessus.

Ce que je ne comprends pas pourquoi il permet à aaa1 1aa or aaa11 1aa

Toutes les idées?

Répondre

4

Vous ne l'avez pas ancré au début et à la fin de la chaîne (^ et $)

^((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}))$ 
+0

qui a fait le tour grâce –

3

En plus de l'ancrage: Je ne sais pas ce que Regex vous utilisez le dialecte, mais je N'a jamais rencontré un où cette syntaxe:

[A-Z-[QVX]] 

exclut les caractères QVX comme vous le souhaitez. Dans la plupart des regex, il s'agit de la classe de caractères A-Z-[, suivie d'une parenthèse fermante littérale. Pour exclure QVX vous auriez à dire:

[A-PR-UWYZ] 

Dans tous les cas, il est généralement pas une bonne idée de « valider » à fond ce codes postaux; Les codes postaux sont une bête de Wilier que la plupart des imaginent, particulièrement si vous voulez permettre des codes postaux historiques et des bizarreries tels que les codes postaux de BFPO (que vous semblez ignorer actuellement). Vous ne voulez pas non plus avoir à mettre à jour votre code si et quand le bureau de poste ajoute de nouveaux codes.

Il est préférable d'utiliser une simple vérification rapide pour les entrées manifestement erronées/manquantes; C'est vraiment une mauvaise chose de refuser un client potentiel parce que vous pensez que son adresse est «invalide».

+0

bon endroit! Java a quelque chose comme ça, '[A-Z && [^ QVX]]' correspond à toutes les lettres majuscules sauf 'Q',' V' et 'X', mais pas à la façon dont l'OP essaie. –

+0

Semble pourrait ignorer 'TDCU 1ZZ' également. – pnuts

0

Utilisez cette regex

^ ?(([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}$