Javascript Code postal britannique regex

J'ai un regex javascript qui valide les codes postaux du Royaume-Uni. Cela fonctionne bien, mais cela ne tient pas compte du fait que certaines personnes l'écrivent avec des espaces au milieu et d'autres pas. J'ai essayé d'ajouter ceci mais je ne peux pas fonctionner: S Les codes postaux du Royaume-Uni sont principalement 2 lettres suivies de 1 ou 2 numéros, des espaces blancs facultatifs et 1 numéro et 2 lettres.

Voici mon regex qui valide les codes postaux sans espaces:

[A-PR-UWYZa-pr-uwyz0-9][A-HK-Ya-hk-y0-9][AEHMNPRTVXYaehmnprtvxy0-9]?[ABEHMNPRVWXYabehmnprvwxy0-9]?{1,2}[0-9][ABD-HJLN-UW-Zabd-hjln-uw-z]{2}|(GIRgir){3} 0(Aa){2})$/g 

Des idées?

modifier

J'ai changé le regex car j'ai réalisé qu'un groupe manquait de caractères minuscules.

Une autre solution serait de supprimer tous les espaces de la chaîne, puis l'exécuter à travers l'expression régulière que vous avez déjà:

 var postalCode = '…'; postalCode = postalCode.replace(/\s/g, ''); // remove all whitespace yourRegex.test(postalCode); // `true` or `false` 

2 lettres suivies de 1 ou 2 numéros, blancs optionnels et 1 numéro et 2 lettres.

Exemple:

 /^[az]{2}\d{1,2}\s*\d[az]{2}$/i 

Expliqué avec http://www.myregextester.com/

  ^ the beginning of the string ---------------------------------------------------------------------- [az]{2} any character of: 'a' to 'z' (2 times) ---------------------------------------------------------------------- \d{1,2} digits (0-9) (between 1 and 2 times (matching the most amount possible)) ---------------------------------------------------------------------- \s* whitespace (\n, \r, \t, \f, and " ") (0 or more times (matching the most amount possible)) ---------------------------------------------------------------------- \d digits (0-9) ---------------------------------------------------------------------- [az]{2} any character of: 'a' to 'z' (2 times) ---------------------------------------------------------------------- $ before an optional \n, and the end of the string 

Selon une page archivée que j'ai trouvée , la spécification est:

 Pattern w/o space RLE General AN NAA ANNAA A1 N2 A2 | A{1,2} N{2,3} A2 ANN NAA ANNNAA A1 N3 A2 | AAN NAA AANNAA A2 N2 A2 | AANN NAA AANNNAA A2 N3 A2 | ANA NAA ANANAA A1 N1 A1 N1 A2 | A{1,2} N1 A1 N1 A2 AANA NAA AANANAA A2 N1 A1 N1 A2 | GIR 0AA We are British and for every rule there must be an equal and opposite exception. 

Peut-être est-ce trop tracas pour éviter une validation de la page. Rappelez-vous, vous devrez le maintenir en cas de changement. Considérons un contrôle minimum comme ^[AZ].+[0-9].+[AZ]$ . Ne soyez pas un «héros» et incluez le code.

Si vous voulez vraiment le valider contre cette spécification, les règles générales (après avoir décapé les espaces) sont les suivantes:

 ^([AZ]{1,2})([0-9]{2,3})([AZ]{2})$/i ^([AZ]{1,2})([0-9])([AZ])([0-9])([AZ]{2})$/i ^GIR0AA$/i 

Comme l'a souligné @Stefan: / i pour une insensibilité aux cas.

Une fois que vous avez fait cela, vous pouvez faire correspondre les groupes (d'où les accolades) et vérifier que les lettres correspondent aux plages restreintes du document. À ce stade, vous pouvez même conserver une liste des codes autorisés à une et deux lettres pour les zones de code postal.

La règle générale pour séparer l'Incode (chunk before the space) du Outcode (chunk after the space) semble être que le Outcode commence à partir du dernier nombre (même pour GIR).

Franchement, j'arrêterais de déranger après le contrôle de base. Si cela vaut la validité contre une spécification plus complète, il vaut probablement la peine de vérifier que la zone de code postal existe, et si cela vaut la peine, vous pouvez vous connecter à un service réel qui extrait l'adresse du code postal. Ces services vous informeront volontiers qu'un code postal n'existe pas, ce qui est un contrôle plus robuste et plus durable que vous ne le souhaiteriez jamais écrire.

[Modifier: il y a une autre spécification sur Wikipedia, bien sûr]

Nous avons constaté que la plupart des regex ne couvrent pas entièrement les codes postaux du Royaume-Uni. Nous avons trouvé qu'il devait couvrir ces options:

  • A1 1AA
  • A1A 1AA
  • AA11 1AA

Sur cette base, je recommanderais:

/^([AZ][A-Z0-9]?[A-Z0-9]?[A-Z0-9]? {1,2}[0-9][A-Z0-9]{2})$/;

Le code postal GIR0AA appartenait à Girobank mais n'est plus pris en charge, voir référence: http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

Je ne sais pas comment le code postal du Royaume-Uni est terminé, et je ne l'ai pas compris à partir de votre description. En passant, vous pouvez ajouter \s{0,1} où vous devez dire "ici, nous pourrions avoir un espace". Cela signifie "0 ou 1 espace".