240 votes

Expression régulière pour faire correspondre un numéro de téléphone standard à 10 chiffres

Je veux écrire une expression régulière pour un numéro de téléphone standard de type américain qui prend en charge les formats suivants :

###-###-####
(###) ###-####
### ### ####
###.###.####

où # signifie un nombre quelconque. Jusqu'à présent, j'ai obtenu les expressions suivantes

^[1-9]\d{2}-\d{3}-\d{4}
^\(\d{3}\)\s\d{3}-\d{4}
^[1-9]\d{2}\s\d{3}\s\d{4}
^[1-9]\d{2}\.\d{3}\.\d{4}

respectivement. Je ne suis pas tout à fait sûr que le dernier soit correct pour le contrôle en pointillé. Je voudrais également savoir s'il existe un moyen d'écrire une seule expression au lieu des quatre différentes qui correspondent aux différents formats que j'ai mentionnés. Si c'est le cas, je ne sais pas comment m'y prendre. Je ne sais pas non plus comment modifier l'expression ou les expressions pour pouvoir inclure une condition permettant de prendre en charge le code régional en tant que composant facultatif. Quelque chose comme

+1 ### ### ####

où +1 est l'indicatif régional et il est facultatif.

1voto

Kiran Bhattarai Points 147

La regex ci-dessus est une légère modification de @Francis Gagnon.

Objectif : Pour détecter tout modèle possible, un utilisateur peut partager son numéro de téléphone américain.


Version 1 :

^\s*(?:\+?(\d{1,3}))?[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

Testez-le ici Codepen : https://codepen.io/kiranbhattarai/pen/NWKMXQO

Explication de la regex : https://regexr.com/4kt5j


Version 2 :

\s*(?:\+?(\d{1,3}))?[\W\D\s]^|()*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

Ce qu'il contient : Les cas de test peuvent faire partie de la chaîne. Dans la version 1, les cas de test devraient être le début d'une ligne à travailler.

Codepen : https://codepen.io/kiranbhattarai/pen/GRKGNGG

Explication de la regex : https://regexr.com/4kt9n


Si vous trouvez un modèle qui peut échouer, merci de le commenter, je le corrigerai.

Cas de test : Réussi

8 0   0  4  4  4  5   55 5
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234
800 (555) 1234
800(555)1234
8 0 0 5 5 5 1 2 3 4
8.0.0.5.5.5.1.2.3.4
8-0-0-5-5-5-1-2-3-4
(8)005551234
(80)05551234
8(00)5551234
8@0@0@5551234
8/0/0/5/5/5/1/2/3/4
8*0*0*5*5*5*1*2*3*4
8:0:0:5:5:5:1:2:3:4
8,0,0,5,5,5,1,2,3,4
800,555,1234
800:555:1234
1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

1voto

hobberwickey Points 1393

Je lance juste cette réponse car elle résout un de mes problèmes, elle est basée sur la réponse de @stormy, mais inclut les codes de pays à 3 chiffres et, plus important, peut être utilisée n'importe où dans une chaîne, mais ne correspondra pas si elle n'est pas précédée d'un espace/début de chaîne et se termine par une limite de mot. C'est utile pour éviter de faire correspondre des nombres aléatoires au milieu d'une URL ou autre.

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)

1voto

smartexpert Points 183

Voici une regex qui correspond aux numéros nord-américains ainsi qu'aux numéros internationaux tels que ceux du Moyen-Orient.

^((\+|0{0,2})([0-9]){1,3})?[-.\s]?\(?([0-9]{2,3})\)?[-.\s]?([0-9]{3})[-.\s]?([0-9]{4})$

0voto

amalgamate Points 157
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}

0voto

jake Points 1

Il s'agit d'une version plus complète qui correspondra à tout ce à quoi je peux penser et vous donnera une correspondance de groupe pour le pays, la région, le prénom et le nom.

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X