245 votes

UK Postcode Regex (complet)

Je suis à la recherche d'une regex qui validera un code postal britannique complet et complexe uniquement dans une chaîne d'entrée. Toutes les formes peu communes de codes postaux doivent être couvertes, ainsi que les formes habituelles. Par exemple :

Correspondances

  • CW3 9SS
  • SE5 0EG
  • SE50EG
  • se5 0eg
  • WC2H 7LT

Pas de correspondance

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

Existe-t-il des regex officielles ou même semi-officielles utilisées pour ce genre de choses ? Avez-vous d'autres conseils sur le formatage et le stockage de ces données dans une base de données ?

259voto

marcj Points 839

Je vous recommande de jeter un coup d'œil à la norme de données du gouvernement britannique pour les codes postaux [lien maintenant mort] ; archive de XML voir Wikipedia pour discussion]. Il y a une brève description des données et le schéma xml joint fournit une expression régulière. Ce n'est peut-être pas exactement ce que vous voulez, mais ce serait un bon point de départ.

Le RegEx fourni par le gouvernement britannique était :

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

Comme indiqué dans la discussion sur Wikipédia, cela permet de prendre en compte certains codes postaux non réels (par exemple ceux qui commencent par AA, ZY) et ils fournissent un test plus rigoureux que vous pouvez essayer.

87voto

Colin Points 393

Il semble que nous allons utiliser ^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$ qui est une version légèrement modifiée de celle suggérée par Minglis ci-dessus.

Toutefois, nous allons devoir examiner les règles exactes, car les diverses solutions énumérées ci-dessus semblent appliquer des règles différentes quant aux lettres autorisées.

Après quelques recherches, nous avons trouvé quelques informations supplémentaires. Apparemment, une page sur "govtalk.gov.uk" vous dirige vers une spécification de code postal. govtalk-postcodes . Cela renvoie à un schéma XML à l'adresse Schéma XML qui fournit une déclaration "pseudo regex" des règles du code postal.

Nous avons pris cela et l'avons un peu retravaillé pour obtenir l'expression suivante :

^((GIR &0AA)|((([A-PR-UWYZ][A-HK-Y]?[0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]))) &[0-9][ABD-HJLNP-UW-Z]{2}))$

Les espaces sont facultatifs, mais vous êtes limité à un espace (remplacez le "&" par "{0,}" pour des espaces illimités). Elle suppose que tout le texte doit être en majuscules.

Si vous voulez autoriser les minuscules, avec un nombre quelconque d'espaces, utilisez :

^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

Cela ne couvre pas les territoires d'outre-mer et ne fait qu'appliquer le format, PAS l'existence de zones différentes. Il est basé sur les règles suivantes :

Peut accepter les formats suivants :

  • "GIR 0AA"
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • A9C 9ZZ
  • AD9E 9ZZ

Où :

  • Le 9 peut être n'importe quel numéro à un chiffre.
  • A peut être n'importe quelle lettre sauf Q, V ou X.
  • B peut être n'importe quelle lettre sauf I, J ou Z.
  • C peut être n'importe quelle lettre sauf I, L, M, N, O, P, Q, R, V, X, Y ou Z.
  • D peut être n'importe quelle lettre sauf I, J ou Z.
  • E peut être l'un quelconque de A, B, E, H, M, N, P, R, V, W, X ou Y.
  • Z peut être n'importe quelle lettre sauf C, I, K, M, O ou V.

Meilleurs vœux

Colin

48voto

Ben Points 23834

Il n'existe pas d'expression régulière complète pour les codes postaux britanniques qui soit capable de validation de un code postal. Vous pouvez vérifier qu'un code postal est dans le bon format en utilisant une expression régulière, mais pas qu'il existe réellement.

Les codes postaux sont arbitrairement complexes et en constante évolution. Par exemple, l'outcode W1 ne dispose pas, et ne disposera peut-être jamais, de tous les numéros compris entre 1 et 99, pour chaque zone de code postal.

Vous ne pouvez pas vous attendre à ce que ce qui existe actuellement soit vrai pour toujours. Par exemple, en 1990, le bureau de poste a décidé qu'Aberdeen devenait un peu surpeuplé. Elle a ajouté un 0 à la fin de AB1-5 pour en faire AB10-50, puis a créé un certain nombre de codes postaux intermédiaires.

Chaque fois qu'une nouvelle rue est construite, un nouveau code postal est créé. Cela fait partie du processus d'obtention du permis de construire ; les autorités locales sont obligées de le tenir à jour auprès de la Poste (mais elles ne le font pas toutes).

En outre, comme l'ont noté plusieurs autres utilisateurs, il y a les codes postaux spéciaux tels que Girobank, GIR 0AA, et celui des lettres au Père Noël, SAN TA1 - vous ne voulez probablement pas poster quoi que ce soit à cet endroit, mais il ne semble pas être couvert par une autre réponse.

Ensuite, il y a les codes postaux BFPO, qui sont maintenant le passage à un format plus standard . Les deux formats seront valables. Enfin, il y a les territoires d'outre-mer source Wikipédia .

+----------+----------------------------------------------+
| Postcode |                   Location                   |
+----------+----------------------------------------------+
| AI-2640  | Anguilla                                     |
| ASCN 1ZZ | Ascension Island                             |
| STHL 1ZZ | Saint Helena                                 |
| TDCU 1ZZ | Tristan da Cunha                             |
| BBND 1ZZ | British Indian Ocean Territory               |
| BIQQ 1ZZ | British Antarctic Territory                  |
| FIQQ 1ZZ | Falkland Islands                             |
| GX11 1AA | Gibraltar                                    |
| PCRN 1ZZ | Pitcairn Islands                             |
| SIQQ 1ZZ | South Georgia and the South Sandwich Islands |
| TKCA 1ZZ | Turks and Caicos Islands                     |
+----------+----------------------------------------------+

Ensuite, il faut tenir compte du fait que le Royaume-Uni a "exporté" son système de codes postaux dans de nombreux endroits du monde. Tout ce qui valide un code postal "britannique" validera également les codes postaux d'un certain nombre d'autres pays.

Si vous voulez valider un code postal britannique, la façon la plus sûre de le faire est d'utiliser une recherche des codes postaux actuels. Il existe un certain nombre d'options :

  • Communiqués de l'Ordnance Survey Code-Point Ouvert sous une licence de données ouvertes. Ce sera légèrement en retard sur l'époque, mais c'est gratuit. Il n'y aura (probablement - je ne me souviens plus) pas de données sur l'Irlande du Nord, car l'Ordnance Survey n'a pas de mandat dans cette région. La cartographie de l'Irlande du Nord est réalisée par l'Ordnance Survey of Northern Ireland et ils ont leur propre système, séparé et payant, Pointeur produit. Vous pourriez l'utiliser et ajouter les quelques produits qui ne sont pas couverts assez facilement.

  • Royal Mail publie le Fichier d'adresses de codes postaux (FAP) Cela inclut le BFPO, mais je ne suis pas sûr que Code-Point Open le fasse. Il est mis à jour régulièrement mais coûte cher (et ils peuvent être carrément méchants à ce sujet parfois). PAF inclut l'adresse complète plutôt que les seuls codes postaux et est livré avec son propre système d'information. Guide du programmeur . L'Open Data User Group (ODUG) fait actuellement pression pour que le PAF soit publié gratuitement, voici une description de leur poste .

  • Enfin, il y a AddressBase Plus et AddressBase Premium . Il s'agit d'une collaboration entre Ordnance Survey, les autorités locales, Royal Mail et une société de jumelage pour créer un répertoire définitif de toutes les informations sur toutes les adresses du Royaume-Uni (ils ont eu un certain succès). Il est payant, mais si vous travaillez avec une autorité locale, un département gouvernemental ou un service gouvernemental, vous pouvez l'utiliser gratuitement. Il contient bien d'autres informations que les codes postaux.

23voto

RichardTowers Points 2019

J'ai jeté un coup d'œil à certaines des réponses ci-dessus et je vous déconseille d'utiliser le modèle de la réponse de @Dan (c. 15 déc. '10), car il signale à tort que près de 0,4 % des codes postaux valides sont invalides, alors que les autres ne le sont pas.

Ordnance Survey fournit un service appelé Code Point Open :

contient une liste de toutes les unités de codes postaux actuelles en Grande-Bretagne.

J'ai exécuté chacune des regexs ci-dessus contre la liste complète des codes postaux (6 juillet '13) de ces données en utilisant grep :

cat CSV/*.csv |
    # Strip leading quotes
    sed -e 's/^"//g' |
    # Strip trailing quote and everything after it
    sed -e 's/".*//g' |
    # Strip any spaces
    sed -E -e 's/ +//g' |
    # Find any lines that do not match the expression
    grep --invert-match --perl-regexp "$pattern"

Il y a 1 686 202 codes postaux au total.

Voici les nombres de codes postaux valides qui le font pas correspondre à chaque $pattern :

'^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$'
# => 6016 (0.36%)

'^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$'
# => 0

'^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}$'
# => 0

Bien entendu, ces résultats ne concernent que les codes postaux valides qui sont signalés à tort comme non valides. Donc :

'^.*$'
# => 0

Je ne dis rien sur le modèle qui est le meilleur pour filtrer les codes postaux invalides.

21voto

Dan Points 12178
^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$

Expression régulière pour correspondre aux valides au Royaume-Uni. Dans le système postal britannique, toutes les toutes les lettres ne sont pas utilisées dans toutes les positions (comme pour les plaques d'immatriculation d'immatriculation des véhicules) et il existe diverses règles régissent cela. Cette regex prend en compte compte de ces règles. Détails des règles : Première moitié du code postal Valide formats [A-Z][A-Z][0-9][A-Z] [A-Z][A-Z][0-9][0-9] [A-Z][0-9][0-9] [A-Z][A-Z][0-9] [A-Z][A-Z][A-Z] [A-Z] [0-9] [A-Z] [A-Z] [0-9] Exceptions Position - Première. Contrainte - QVX non utilisé Position - Deuxième. Contraint - IJZ non utilisé sauf dans GIR 0AA Position - Troisième. Contrainte - AEHMNPRTVXY uniquement utilisé Position - Quatrième. Contrainte - ABEHMNPRVWXY Deuxième moitié du code postal Formats valides [0-9][A-Z][A-Z] Exceptions Poste - Deuxième et troisième. Contraint - CIKMOV non utilisé

http://regexlib.com/REDetails.aspx?regexp_id=260

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X