regex pour code postal

118

Duplicata possible:
quel est le code postal ultime et l'expression régulière zip?

J'ai besoin de Regex qui peut satisfaire mes trois conditions pour le code postal. Par exemple-

  1. 12345
  2. 12345-6789
  3. 12345 1234

Tous les pointeurs et suggestions seraient très appréciés. Merci !

Shaitender Singh
la source
4
La fermeture en double semble sommaire - le dupe demande une expression régulière qui correspondra à n'importe quel code postal de n'importe quel pays, alors que cette question demande une expression régulière correspondant aux codes postaux, qui sont réservés aux États-Unis, ce qui rend cette question beaucoup portée plus étroite que la dupe - mais il y a en fait une réponse à trouver à la dupe. Voir stackoverflow.com/a/7185241/1709587 qui répertorie les expressions régulières de code postal Unicode CLDR (anciens, maintenant obsolètes, mais probablement toujours adéquats dans de nombreux cas) pour plus de 100 pays, y compris les États-Unis. La regex américaine est \d{5}([ \-]\d{4})?.
Mark Amery

Réponses:

311
^\d{5}(?:[-\s]\d{4})?$
  • ^ = Début de la chaîne.
  • \d{5} = Correspond à 5 chiffres (pour la condition 1, 2, 3)
  • (?:…) = Regroupement
  • [-\s] = Correspond à un espace (pour la condition 3) ou un tiret (pour la condition 2)
  • \d{4} = Correspond à 4 chiffres (pour les conditions 2, 3)
  • …? = Le modèle avant qu'il soit facultatif (pour la condition 1)
  • $ = Fin de la chaîne.
KennyTM
la source
7
\scorrespondra à tous les espaces, y compris les tabulations et les nouvelles lignes.
paupière
1
Salut que dire de la condition 123451234 sans espace
Ajay Suwalka
4
@ProVega: Lire les commentaires sur la réponse (maintenant supprimée) que vous avez liée, qui semble être incorrecte. Par exemple, 00544est un code postal valide; 544n'est pas.
Keith Thompson
2
@AjaySuwalka: Tout ce que vous auriez à faire pour accueillir 123451234 sans espace est de placer un? après [- \ s], il deviendrait donc: ^ \ d {5} (?: [- \ s]? \ d {4})? $
Grungondola
6
Un peu tard à la fête, et peut-être pas la plus jolie cloche du bal, mais j'ai ajouté des espaces optionnels supplémentaires de chaque côté du trait d'union - principalement pour l'esthétique. /(^\d{5}(?:[\s]?[-\s][\s]?\d{4})?$)/
Birrel
4

Pour les trois conditions répertoriées uniquement, ces expressions peuvent également fonctionner:

^\d{5}[-\s]?(?:\d{4})?$
^\[0-9]{5}[-\s]?(?:[0-9]{4})?$
^\[0-9]{5}[-\s]?(?:\d{4})?$
^\d{5}[-\s]?(?:[0-9]{4})?$

Veuillez consulter cette démo pour plus d'explications.

Si nous aurions eu des espaces supplémentaires inattendus entre 5 et 4 chiffres ou un code postal continu à 9 chiffres, tels que:

123451234
12345 1234
12345  1234

cette expression par exemple serait une option secondaire avec moins de contraintes:

^\d{5}([-]|\s*)?(\d{4})?$

Veuillez consulter cette démo pour plus d'explications.

Circuit RegEx

jex.im visualise les expressions régulières:

entrez la description de l'image ici

Tester

const regex = /^\d{5}[-\s]?(?:\d{4})?$/gm;
const str = `12345
12345-6789
12345 1234
123451234
12345 1234
12345  1234
1234512341
123451`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Emma
la source
0

Je sais que cela peut être évident pour la plupart des gens qui utilisent RegEx fréquemment, mais au cas où des lecteurs seraient nouveaux sur RegEx, j'ai pensé que je devrais signaler une observation que j'ai faite qui a été utile pour l'un de mes projets.

Dans une réponse précédente de @kennytm:

^\d{5}(?:[-\s]\d{4})?$

…? = Le modèle avant qu'il soit facultatif (pour la condition 1)

Si vous souhaitez autoriser les codes postaux standard à 5 chiffres et +4, ceci est un excellent exemple.

Pour faire correspondre uniquement les codes postaux au format US 'Zip + 4' comme je devais le faire (conditions 2 et 3 uniquement), supprimez simplement le dernier ?afin qu'il corresponde toujours au dernier groupe de 5 caractères.

Un outil utile que je recommande pour bricoler avec RegEx est lié ci-dessous:

https://regexr.com/

J'utilise cet outil fréquemment lorsque je trouve RegEx qui fait quelque chose de similaire à ce dont j'ai besoin, mais qui pourrait être un peu mieux adapté. Il dispose également d'un menu de référence RegEx astucieux et d'une interface informative qui vous tient au courant de l'impact de vos modifications sur les correspondances pour l'exemple de texte que vous avez entré.

Si quelque chose ne va pas ou si j'ai manqué une information importante, veuillez me corriger.

NjalTheKnut
la source
ou vous pouvez vous référer à ce tutoriel sur les regex - youtube.com/watch?v=8uCHRyK_VMo
Krishnraj Rana