Regex efficace pour la fonction de code postal canadien

var regex = /[A-Za-z]\d[A-Za-z] ?\d[A-Za-z]\d/; var match = regex.exec(value); if (match){ if ( (value.indexOf("-") !== -1 || value.indexOf(" ") !== -1 ) && value.length() == 7 ) { return true; } else if ( (value.indexOf("-") == -1 || value.indexOf(" ") == -1 ) && value.length() == 6 ) { return true; } } else { return false; } 

Le regex recherche le motif A0A 1B1. Vrais tests:

A0A 1B1

A0A-1B1

A0A1B1

A0A1B1C << problème enfant

J'ai donc ajouté un chèque pour "-" ou "", puis une vérification de la longueur.

Existe-t-il une méthode regex ou plus efficace?

Ajoutez des ancrages à votre motif:

 var regex = /^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/; 

^ Signifie "début de chaîne" et $ signifie "fin de chaîne". L'ajout de ces ancrages empêchera le C de glisser vers la correspondance puisque votre motif attend maintenant qu'une chaîne entière soit composée de 6 caractères (parfois 7 – en tant que espace). Ce bonus ajouté devrait maintenant vous atténuer de devoir vérifier ultérieurement la longueur de la chaîne.

En outre, comme il semble que vous souhaitez autoriser les traits d'union, vous pouvez le glisser dans une classe de caractères facultative qui inclut l'espace que vous utilisiez à l'origine. Assurez-vous de laisser le trait d'union comme le premier ou le dernier caractère; Sinon, vous devrez l'échapper (en utilisant une barre oblique invariable) pour éviter que le moteur regex ne l'interprète comme partie d'une plage de caractères (p. Ex. AZ ).

Ceci nous gère et code ca.

 function postalFilter (postalCode) { if (! postalCode) { return null; } postalCode = postalCode.toString().trim(); var us = new RegExp("^\\d{5}(-{0,1}\\d{4})?$"); var ca = new RegExp(/([ABCEGHJKLMNPRSTVXY]\d)([ABCEGHJKLMNPRSTVWXYZ]\d){2}/i); if (us.test(postalCode.toString())) { return postalCode; } if (ca.test(postalCode.toString().replace(/\W+/g, ''))) { return postalCode; } return null; } // these 5 return null console.log(postalFilter('1a1 a1a')); console.log(postalFilter('F1A AiA')); console.log(postalFilter('A12345-6789')); console.log(postalFilter('W1a1a1')); // no "w" console.log(postalFilter('Z1a1a1')); // ... or "z" allowed in first position! // these return canada postal less space console.log(postalFilter('a1a 1a1')); console.log(postalFilter('H0H 0H0')); // these return unaltered console.log(postalFilter('H0H0H0')); console.log(postalFilter('a1a1a1')); console.log(postalFilter('12345')); console.log(postalFilter('12345-6789')); console.log(postalFilter('123456789')); // strip spaces console.log(postalFilter(' 12345 ')); 

Vous avez un problème avec le regex StatsCan a posté les règles pour ce qu'est un code postal canadien valide:

Le code postal est un code à six caractères défini et maintenu par la Société canadienne des postes (CPC) dans le but de trier et de transmettre le courrier. Les caractères sont organisés sous la forme 'ANA NAN', où 'A' représente un caractère alphabétique et 'N' représente un caractère numérique (par exemple, K1A 0T6). Le code postal utilise 18 caractères alphabétiques et 10 caractères numériques. Les codes postaux n'incluent pas les lettres D, F, I, O, Q ou U, et la première position ne fait pas non plus usage des lettres W ou Z.

Le regex devrait être si vous vouliez qu'il soit strict.

 /^[ABCEGHJ-NPRSTVXY][0-9][ABCEGHJ-NPRSTV-Z] [0-9][ABCEGHJ-NPRSTV-Z][0-9]$/ 

De plus \ d signifie que le nombre n'est pas nécessairement 0-9 il peut y avoir le navigateur errant qui le traite comme n'importe quel numéro dans l'espace unicode qui pourrait causer des problèmes pour vous en aval.

De: https://trajano.net/2017/05/canadian-postal-code-validation/

 function postalFilter (postalCode, type) { if (!postalCode) { return null; } postalCode = postalCode.toString().trim(); var us = new RegExp("^\\d{5}(-{0,1}\\d{4})?$"); // var ca = new RegExp(/^((?!.*[DFIOQU])[A-VXY][0-9][AZ])|(?!.*[DFIOQU])[A-VXY][0-9][AZ]\ ?[0-9][AZ][0-9]$/i); var ca = new RegExp(/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]( )?\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i); if(type == "us"){ if (us.test(postalCode.toString())) { console.log(postalCode); return postalCode; } } if(type == "ca") { if (ca.test(postalCode.toString())) { console.log(postalCode); return postalCode; } } return null; }