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.

· 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.
/^ (\+? 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 :
/^\d{3}-\d{3}-\d{4}$/Doit correspondre1/1
- 555-123-4567
Ne doit pas3/3
- 555.123.4567
- 555 123 4567
- 555-1234
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.
/^\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
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) :
/^\d{3}([-. ]?)\d{3}\1\d{4}$/Doit correspondre2/2
- 555-123-4567
- 5551234567
Ne doit pas2/2
- 555-123.4567
- 555 123-4567
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 :
/^\(?\d{3}\)?[-. ]?\d{3}[-. ]?\d{4}$/- (555) 123-4567
- (555-123-4567
- 555) 123-4567
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) :
/^(\(\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
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 :
/^(\+?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
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 :
/^[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
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.
/^\+[1-9]\d{1,14}$/Doit correspondre3/3
- +15551234567
- +442079460958
- +8613800138000
Ne doit pas4/4
- 5551234567
- +1 555 123 4567
- +0123456789
- +1234567890123456
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 :
/[\s().-]/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 (
+999n'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 :
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.
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
- Le parcours Validateurs du monde réel de l'Académie couvre les codes postaux, les dates, les heures, les e-mails et bien plus, une chasse à la fois.
- La section du guide sur les motifs courants propose d'autres exemples interactifs.
- Essayez la chasse du jour, ou attaquez les plateaux plus anciens dans les archives.