Motifs1 chasse jouable incluse

Regex pour les numéros de téléphone : formats américains, E.164, et quand s'arrêter

Un même numéro de téléphone se tape d'une dizaine de façons. Voici comment reconnaître les numéros américains avec tirets, points, espaces, parenthèses et un +1 facultatif, comment vérifier le format international E.164, et pourquoi une vraie validation demande une bibliothèque.

Logo de Regex Hunter

· 8 min de lecture · Mis à jour le

/^\d{3}[-. ]?\d{3}[-. ]?\d{4}$/

à attraper

  • 555-123-4567
  • 555.123.4567
  • 5551234567

à épargner

  • 555-1234
  • 55-123-4567
  • 555-123-456

Demandez leur numéro à dix personnes, et vous le recevrez sous dix formes : 555-123-4567, (555) 123-4567, 555.123.4567, +1 555 123 4567, 5551234567. C'est pourtant le même numéro.

Une regex de téléphone doit accepter les formes que les gens tapent vraiment, tout en repérant les erreurs évidentes. Cet article construit un motif pour les numéros américains pièce par pièce, aborde ensuite le format international, et termine par ce qu'une regex ne sait pas faire. Tous les exemples sont interactifs : modifiez les motifs et regardez les lignes changer.

Réponse rapideJavaScript
/^(\+?1[-. ]?)?(\(\d{3}\) ?|\d{3}[-. ]?)\d{3}[-. ]?\d{4}$/

Un numéro américain à 10 chiffres, avec tirets, points ou espaces facultatifs, des parenthèses autour de l'indicatif régional et un +1 facultatif devant.

Accepte

  • 555-123-4567
  • (555) 123-4567
  • +1 555.123.4567

Rejette

  • 555-1234
  • 55-123-4567
  • 555-123-45678

01Commencer par les chiffres

Un numéro américain, c'est un indicatif régional de 3 chiffres, un central de 3 chiffres et un numéro de ligne de 4 chiffres. La version la plus stricte n'accepte qu'un seul format :

Correspondances4/4 comme prévu
/^\d{3}-\d{3}-\d{4}$/

Doit correspondre1/1

  • 555-123-4567

Ne doit pas3/3

  • 555.123.4567
  • 555 123 4567
  • 555-1234
Essayez-le dans le bac à sable
Seule la forme avec tirets passe. Les versions avec points et espaces sont le même numéro, et elles sont rejetées.

C'est très bien si vous contrôlez le masque de saisie. Si les gens tapent librement, c'est trop strict.

02Autoriser les séparateurs courants

Remplacez chaque tiret par [-. ]? : un tiret, un point ou un espace, et le ? le rend facultatif pour que les chiffres seuls passent aussi.

Correspondances7/7 comme prévu
/^\d{3}[-. ]?\d{3}[-. ]?\d{4}$/

Doit correspondre4/4

  • 555-123-4567
  • 555.123.4567
  • 555 123 4567
  • 5551234567

Ne doit pas3/3

  • 555-1234
  • 55-123-4567
  • 555-123-456
Essayez-le dans le bac à sable
Tirets, points, espaces ou rien du tout. Le nombre de chiffres doit toujours être exactement 3, 3 et 4.

Un effet de bord : chaque séparateur est choisi indépendamment, donc 555-123.4567 passe aussi. C'est généralement sans gravité. Si vous voulez que les deux séparateurs soient identiques, capturez le premier et répétez-le avec une référence arrière (backreference ; plus de détails dans notre guide des références arrière) :

Correspondances4/4 comme prévu
/^\d{3}([-. ]?)\d{3}\1\d{4}$/

Doit correspondre2/2

  • 555-123-4567
  • 5551234567

Ne doit pas2/2

  • 555-123.4567
  • 555 123-4567
Essayez-le dans le bac à sable
([-. ]?) capture le séparateur utilisé, même vide, et \1 exige à nouveau le même.

03Des parenthèses autour de l'indicatif

La correction tentante pour (555) 123-4567 consiste à rendre chaque parenthèse facultative avec \(? et \)?. Cela accepte des saisies déséquilibrées :

Correspondances3/3 comme prévu
/^\(?\d{3}\)?[-. ]?\d{3}[-. ]?\d{4}$/
  • (555) 123-4567
  • (555-123-4567
  • 555) 123-4567
Essayez-le dans le bac à sable
Chaque parenthèse est facultative indépendamment, donc un ( ou un ) isolé passe.

L'alternance règle le problème. Soit l'indicatif est entre parenthèses (avec un espace facultatif après), soit il est nu (avec un séparateur facultatif après) :

Correspondances6/6 comme prévu
/^(\(\d{3}\) ?|\d{3}[-. ]?)\d{3}[-. ]?\d{4}$/

Doit correspondre4/4

  • (555) 123-4567
  • (555)123-4567
  • 555-123-4567
  • 555.123.4567

Ne doit pas2/2

  • (555-123-4567
  • 555) 123-4567
Essayez-le dans le bac à sable
Deux branches pour l'indicatif. Un ( sans son ) ne correspond à aucune des deux.

04Le +1 facultatif

L'indicatif des États-Unis est 1, écrit +1, 1 ou carrément omis. Placez-le dans un groupe facultatif au début :

Correspondances7/7 comme prévu
/^(\+?1[-. ]?)?(\(\d{3}\) ?|\d{3}[-. ]?)\d{3}[-. ]?\d{4}$/

Doit correspondre5/5

  • +1 555 123 4567
  • 1-555-123-4567
  • +1 (555) 123-4567
  • 15551234567
  • 555-123-4567

Ne doit pas2/2

  • +44 20 7946 0958
  • 555-1234
Essayez-le dans le bac à sable
(\+?1[-. ]?)? est un plus facultatif, un 1 et un séparateur facultatif. Le groupe entier peut être sauté.

Voilà un motif solide pour un formulaire réservé aux États-Unis.

05Resserrer avec les règles des indicatifs

Les vrais indicatifs régionaux américains et les codes de central (les trois chiffres du milieu) ne commencent jamais par 0 ou 1. Remplacer \d{3} par [2-9]\d{2} à ces deux endroits rejette le faux numéro classique :

Correspondances5/5 comme prévu
/^[2-9]\d{2}[-. ]?[2-9]\d{2}[-. ]?\d{4}$/

Doit correspondre2/2

  • 212-555-0199
  • 415.555.2671

Ne doit pas3/3

  • 123-456-7890
  • 555-012-3456
  • 555-123-4567
Essayez-le dans le bac à sable
123-456-7890 est exclu car son indicatif commence par 1. Les deux derniers ont un central qui commence par 0 ou 1, y compris l'exemple utilisé depuis le début.

Que cela en vaille la peine dépend de vos utilisateurs. Cela attrape quelques fautes de frappe, mais rend aussi le motif plus difficile à lire.

06Les numéros internationaux : E.164

Hors des États-Unis, les formats varient trop pour un seul motif. Plutôt que d'essayer, la plupart des systèmes stockent les numéros au format E.164, la norme internationale : un +, l'indicatif du pays, puis le numéro, sans espaces ni ponctuation, et 15 chiffres au maximum. Les indicatifs de pays ne commencent jamais par 0.

Correspondances7/7 comme prévu
/^\+[1-9]\d{1,14}$/

Doit correspondre3/3

  • +15551234567
  • +442079460958
  • +8613800138000

Ne doit pas4/4

  • 5551234567
  • +1 555 123 4567
  • +0123456789
  • +1234567890123456
Essayez-le dans le bac à sable
Un plus, un premier chiffre non nul, puis jusqu'à 14 chiffres de plus. Ni espaces, ni tirets, ni parenthèses.

L'approche habituelle consiste à laisser les gens taper leur numéro comme ils veulent, retirer la ponctuation, puis vérifier le résultat. Une regex est parfaite pour l'étape de nettoyage :

Motif8 car.
/[\s().-]/
Essayez-le dans le bac à sable
N'importe quel espace, parenthèse, point ou tiret. Remplacez chaque correspondance par rien pour transformer « +1 (555) 123-4567 » en « +15551234567 ».

En Python, cela donne re.sub(r"[\s().-]", "", number). En JavaScript, number.replace(/[\s().-]/g, "").

07Ce qu'une regex ne peut pas vous dire

^\+[1-9]\d{1,14}$ vérifie la forme. Il ne peut pas vous dire :

  • si l'indicatif du pays existe (+999 n'en est pas un, et le motif l'accepte),
  • si la longueur est correcte pour ce pays (les numéros britanniques et allemands n'ont pas la même longueur, et certains pays mélangent les longueurs),
  • si le numéro est un mobile, un fixe ou non attribué,
  • si quelqu'un décroche.

Pour une vraie validation, utilisez libphonenumber, la bibliothèque de numéros de téléphone de Google. Elle connaît le plan de numérotation de chaque pays, et elle est portée dans la plupart des langages : phonenumbers en Python et libphonenumber-js en JavaScript. Elle formate aussi les numéros pour l'affichage et les convertit en E.164 pour le stockage :

import phonenumbers

n = phonenumbers.parse("(212) 555-0199", "US")
phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164)  # '+12125550199'
phonenumbers.is_possible_number(n)  # True: the length fits the US plan

Et comme pour les adresses e-mail, la seule façon de prouver qu'un numéro fonctionne, c'est d'y envoyer un code.

08À vous de jouer

Voici un plateau de numéros de téléphone aux formats variés. Inutile de vérifier chaque format séparément. Chaque monstre contient dix chiffres d'affilée (ponctuation mise à part), ce qu'aucun innocent ne fait :

Chasse jouablepar 11

Attrapez les numéros de téléphone américains complets, épargnez les courts.

Cibles · 0/5 attrapées

  • 555-123-4567cible
  • (555) 123-4567cible
  • 555.123.4567cible
  • 5551234567cible
  • +1 555 123 4567cible

Innocents · erreurs : 0

  • 555-1234innocent
  • 12345-6789innocent
  • 2026-10-12innocent
  • 555-123-456innocent
  • 911innocent

Tapez une regex — le plateau se met à jour en direct.

Essayez-le dans le bac à sable
Ça vous plaît ? Une nouvelle chasse chaque jour.Jouer la chasse du jour

09Récapitulatif

  • Pour une saisie américaine uniquement, ^(\+?1[-. ]?)?(\(\d{3}\) ?|\d{3}[-. ]?)\d{3}[-. ]?\d{4}$ couvre les formats courants.
  • Utilisez l'alternance, pas deux parenthèses facultatives, pour que ( et ) aillent par paire.
  • Pour les numéros internationaux, retirez la ponctuation avec [\s().-] et stockez en E.164.
  • Vérifiez la forme avec ^\+[1-9]\d{1,14}$, et utilisez libphonenumber quand l'enjeu est réel.
  • Envoyez un code si vous devez savoir que le numéro existe vraiment.

10Continuez à vous entraîner