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


125

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

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

où # signifie n'importe quel nombre. Jusqu'à présent, j'ai trouvé 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 sais pas si le dernier est correct pour le chèque en pointillé. Je veux aussi savoir s'il est possible que je puisse écrire une seule expression au lieu des 4 différentes qui répondent aux différents formats que j'ai mentionnés. Si tel est le cas, je ne sais pas comment procéder. Et aussi comment modifier l'expression / expressions afin que je puisse également inclure une condition pour prendre en charge l'indicatif régional en tant que composant facultatif. Quelque chose comme

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

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


5
duplication possible de stackoverflow.com/questions/123559/ ... la réponse suggérée est de supprimer tous les caractères non numériques. De cette façon, vous simplifiez la validation
Arnaud Denoyelle

1
Je sais que c'était il y a quelque temps, mais je ne pense pas que les indicatifs régionaux américains puissent commencer par 1. (123) 456-7890 serait invalide en raison du premier 1.
bobanahalf

Pour une réponse correcte plus complète, voir: stackoverflow.com/a/18626090/561710
Joe Johnston

L'analyse des numéros de téléphone est difficile. Google a publié une bibliothèque open source pour cela. Aidez-vous, utilisez libphonenumber (ou un fork dans votre langue)
Aloisdg passe à codidact.com

Réponses:


212
^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

Correspond à ce qui suit

123-456-7890
(123) 456-7890
123 456 7890
123.456.7890
+91 (123) 456-7890

Si vous ne voulez pas de correspondance sur les numéros non américains, utilisez

^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

Mise à jour:
comme l'a remarqué l'utilisateur Simon Weaver ci-dessous, si vous êtes également intéressé par la correspondance avec des nombres non formatés, rendez simplement la classe de caractères de séparation facultative comme[\s.-]?

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

1
Pensez-vous que le point d'interrogation n'est pas nécessaire dans la partie (? \ D {3}) de votre toute première ligne? Je pense que nous avons besoin d'une ou plusieurs occurrences et non de zéro ou d'une occurrence d'un chiffre dans le '(' et ')'
noobcoder

2
Le ?là s'applique sur les parenthèses (), pas sur les chiffres. Le regex associé complet est \(?\d{3}\)?. \d{3}spécifie qu'il doit y avoir trois chiffres entre le ()qui sont (rendus) facultatifs (par ?).
Ravi Thapliyal

6
Remarque: cela ne correspond pas à 1234567890, ce qui peut être un problème ou non pour moi c'était - donc j'ai juste ajouté ?après chaque [\s.-]pour le rendre facultatif
Simon_Weaver

1
@Simon_Weaver Merci pour vos contributions. J'ai ajouté votre observation à la réponse.
Ravi Thapliyal

3
Si vous en voulez un qui évite le problème @BobRay mentionné, utilisez ^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$. (Je viens de dupliquer le segment du RegEx qui couvre l'indicatif régional et autorise une variante avec parenthèses et une sans)
Shrey Gupta

131

Il existe de nombreuses variantes possibles pour ce problème. Voici une expression régulière similaire à une réponse que j'ai précédemment placée sur SO.

^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$

Cela correspondrait aux exemples suivants et bien plus encore:

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
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234

Quelle que soit la façon dont le numéro de téléphone est entré, les groupes de capture peuvent être utilisés pour décomposer le numéro de téléphone afin que vous puissiez le traiter dans votre code.

  • Groupe1: Indicatif du pays (ex: 1 ou 86)
  • Groupe2: Indicatif régional (ex: 800)
  • Groupe3: Échange (ex: 555)
  • Groupe4: Numéro d'abonné (ex: 1234)
  • Groupe 5: Extension (ex: 5678)

Voici une ventilation de l'expression si vous êtes intéressé:

^\s*                #Line start, match any whitespaces at the beginning if any.
(?:\+?(\d{1,3}))?   #GROUP 1: The country code. Optional.
[-. (]*             #Allow certain non numeric characters that may appear between the Country Code and the Area Code.
(\d{3})             #GROUP 2: The Area Code. Required.
[-. )]*             #Allow certain non numeric characters that may appear between the Area Code and the Exchange number.
(\d{3})             #GROUP 3: The Exchange number. Required.
[-. ]*              #Allow certain non numeric characters that may appear between the Exchange number and the Subscriber number.
(\d{4})             #Group 4: The Subscriber Number. Required.
(?: *x(\d+))?       #Group 5: The Extension number. Optional.
\s*$                #Match any ending whitespaces if any and the end of string.

Pour rendre l'indicatif régional facultatif, ajoutez simplement un point d'interrogation après le (\ d {3}) pour l'indicatif régional.


8
meilleure réponse IMHO. Pour mon propos, le \sdébut et la fin ne sont pas nécessaires, car j'utilise pour la validation et le champ est déjà coupé.
Daniel

2
De loin la meilleure réponse et la plus complète. J'apprécie aussi beaucoup la répartition des regex.
Bryant Jackson

@Kondal Je suis curieux de savoir ce que vous utilisez pour le faire échouer. Cela semble bien fonctionner pour moi avec un 0 pour le code du pays.
Francis Gagnon

<input type = "text" name = "phone_no" class = "form-control" ng-pattern = "^ \ s * (?: \ +? (\ d {1,3}))? [-. (] * (\ d {3}) [-.)] * (\ d {3}) [-.] * (\ d {4}) (?: * x (\ d +))? \ s * $ "uniquement -numbers ng-maxlength = "10" />
Kondal

@Kondal Désolé. Je voulais dire le texte que vous essayez de faire correspondre qui échoue avec cette expression régulière.
Francis Gagnon

8

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

Correspond à ces numéros de téléphone:

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
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
18005551234
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

Voir regex101.com


7

En voici un assez compact que j'ai créé.

Search: \+?1?\s*\(?-*\.*(\d{3})\)?\.*-*\s*(\d{3})\.*-*\s*(\d{4})$

Replace: +1 \($1\) $2-$3

Testé par rapport aux cas d'utilisation suivants.

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
+1 (800) 123-4567

Cela correspond à des trucs comme (800444-4444
Jake

6

Ajout d'un exemple utilisant les solutions mentionnées ci-dessus sur jsfiddle. J'ai modifié un peu le code selon les exigences de mes clients. J'espère que cela aide aussi quelqu'un.

/^\s*(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *[x/#]{1}(\d+))?\s*$/

Voir l'exemple ici


4

essayez ceci pour les utilisateurs pakistanais. Voici un assez compact que j'ai créé.

((\+92)|0)[.\- ]?[0-9][.\- ]?[0-9][.\- ]?[0-9]

Testé par rapport aux cas d'utilisation suivants.

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883

4

Numéro de téléphone regex que j'utilise: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

Couvertures:

  • 18001234567
  • 1 800 123 4567
  • + 1800123-4567
  • +86800123 4567
  • 1-800-123-4567
  • 1 (800) 123-4567
  • (800)123-4567
  • (800) 123-4567
  • (800) 1234567
  • 800-123-4567
  • 800.123.4567

2

Les expressions pour 1, 3 et 4 sont assez similaires, vous pouvez donc utiliser:

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

Notez que, selon la langue et la marque des expressions régulières utilisées, vous devrez peut-être mettre à la \2place de $2ou une telle correspondance peut ne pas être prise en charge du tout.

Je ne vois pas de bon moyen de combiner cela avec le format 2, mis à part l'évidence ^(regex for 1,3,4|regex for 2)$qui est laide, maladroite et rend difficile la sortie des parties des nombres.

Quant à l'indicatif régional, vous pouvez ajouter (\+\d)?au début pour capturer un indicatif régional à un chiffre (désolé, je ne connais pas le format de vos indicatifs régionaux).


2

Que dis-tu de ça?

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

EDIT: J'ai oublié celui (). EDIT 2: La première partie à 3 chiffres est erronée.


Il n'est pas nécessaire d'échapper au point .dans une classe de caractères, cela [-\.\s]devrait en fait être le cas [-.\s], car nous ne voulons pas faire correspondre une barre oblique inverse.
Vedran Šego

Cela correspondrait-il réellement à la barre oblique inverse? Je pensais que ce n'était peut-être pas nécessaire, mais je n'étais pas sûr à 100%.
crimson_penguin

Vous avez raison. Je viens de l'essayer (je n'avais jamais eu besoin d'une barre oblique inverse auparavant) [\.]et les [.]deux ne correspondent qu'à un point, tandis que [\\.]correspond à la fois au point et à la barre oblique inverse. Merci pour votre remarque.
Vedran Šego

Mon opinion sur les expressions régulières est que, si vous donnez une expression régulière à quelqu'un, accompagnez-la toujours d'une explication, sinon l'expression régulière est sans valeur. Juste mon avis.
John Red

2

En commençant par la réponse de @ Ravi, j'ai également appliqué certaines règles de validation pour le code NPA (régional) .

En particulier:

  • Il devrait commencer par un 2 (ou plus)
  • Il ne peut pas avoir "11" comme deuxième et troisième chiffres (N11).

Il y a quelques autres restrictions, y compris les blocs réservés (N9X, 37X, 96X) et 555, mais je les ai laissés de côté, en particulier parce que les blocs réservés peuvent voir une utilisation future, et 555 est utile pour les tests.

Voici ce que j'ai proposé:

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

Sinon, si vous souhaitez également faire correspondre des valeurs vides (si le champ n'est pas obligatoire), vous pouvez utiliser:

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

Mes cas de test pour les nombres valides (beaucoup de la réponse de @Francis) sont:

18005551234
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

Mes cas de test invalides incluent:

(003) 555-1212     // Area code starts with 0
(103) 555-1212     // Area code starts with 1
(911) 555-1212     // Area code ends with 11
180055512345       // Too many digits
1 800 5555 1234    // Prefix code too long
+1 800 555x1234    // Invalid delimiter
+867 800 555 1234  // Country code too long
1-800-555-1234p    // Invalid character
1 (800)  555-1234  // Too many spaces
800x555x1234       // Invalid delimiter
86 800 555 1212    // Non-NA country code doesn't have +

Mon expression régulière n'inclut pas le regroupement pour extraire les groupes de chiffres, mais elle peut être modifiée pour les inclure.


2

Peut-être le plus facile à comparer à plusieurs autres.

\(?\d+\)?[-.\s]?\d+[-.\s]?\d+

Il correspond à ce qui suit:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789


Perfect one ... Thanks (y)
Sushil Sharma

2

Ce code correspondra à un numéro de téléphone américain ou canadien et s'assurera également qu'il s'agit d'un indicatif régional et d'un échange valides:

^((\+1)?[\s-]?)?\(?[2-9]\d\d\)?[\s-]?[2-9]\d\d[\s-]?\d\d\d\d

Test sur Regex101.com


2

Patter Regex pour valider un numéro de téléphone régulier à 10 chiffres plus un code international optionnel (1 à 3 chiffres) et un numéro d'extension optionnel (n'importe quel nombre de chiffres):

/(\+\d{1,3}\s?)?((\(\d{3}\)\s?)|(\d{3})(\s|-?))(\d{3}(\s|-?))(\d{4})(\s?(([E|e]xt[:|.|]?)|x|X)(\s?\d+))?/g

Démo: https://www.regextester.com/103299

Entrées valides:

/* Full number */
+999 (999) 999-9999 Ext. 99999

/* Regular local phone number (XXX) XXX-XXXX */
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231

/* International codes +XXX (XXX) XXX-XXXX */
+99 1234567890
+991234567890

/* Extensions (XXX) XXX-XXXX Ext. XXX... */
1234567890 Ext 1123123
1234567890Ext 1123123
1234567890 Ext1123123
1234567890Ext1123123

1234567890 Ext: 1123123
1234567890Ext: 1123123
1234567890 Ext:1123123
1234567890Ext:1123123

1234567890 Ext. 1123123
1234567890Ext. 1123123
1234567890 Ext.1123123
1234567890Ext.1123123

1234567890 ext 1123123
1234567890ext 1123123
1234567890 ext1123123
1234567890ext1123123

1234567890 ext: 1123123
1234567890ext: 1123123
1234567890 ext:1123123
1234567890ext:1123123

1234567890 X 1123123
1234567890X1123123
1234567890X 1123123
1234567890 X1123123
1234567890 x 1123123
1234567890x1123123
1234567890 x1123123
1234567890x 1123123

1

Je trouve cette expression régulière très utile pour moi pour un numéro de contact à 10 chiffres:

^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[789]\d{9}$

Référence : https://regex101.com/r/QeQewP/1

Explication:

entrez la description de l'image ici


Avez-vous utilisé un outil pour générer cette explication? Partagez! Merci
inconnu

@unnknown Ressemble à une capture d'écran d'un vérificateur de regex en ligne, tel que regex101.com. Notez que les directives SO stipulent que tous les textes, codes, données et messages d'erreur doivent être saisis sous forme de texte, pas d'images, car le texte des images peut être difficile à lire, en particulier sur les appareils mobiles, et nécessite une plus grande bande passante. Le texte ne peut pas non plus être copié. Dans ce cas, les couleurs peuvent ajouter quelque chose, pas sûr. Sachez qu'en général, les «réponses» doivent inclure une explication textuelle. Amitesh: il serait utile d'inclure un lien vers ce site, avec votre regex déjà rempli pour que les visiteurs puissent l'expérimenter.
SherylHohman le

@unnknown voici un lien qui produit une image similaire à celle de ce post. La chaîne d'expression régulière d'Amitesh a déjà été collée. Vous pouvez entrer des numéros de téléphone pour tester ses résultats: regex101.com/r/QeQewP/1
SherylHohman

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

0

Ceci est une version plus complète qui correspondra autant que je peux penser et vous donnera une correspondance de groupe pour le pays, la région, le premier et le dernier.

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

0

qu'en est-il des nombres multiples avec "+" et séparez-les par ";" "," "-" ou "" caractères?


0

J'ai fini avec

const regexBase = '(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})?[-. )]*(\\d{3})[-. ]*(\\d{4,5})(?: *x(\\d+))?'; const phoneRegex = new RegExp('\\s*' + regexBase + '\\s*', 'g');

c'était pour permettre des choses comme les nombres néerlandais, par exemple

+358 300 20200


0

Au-dessus de regex se trouve une légère modification de @Francis Gagnon.

Objectif: détecter tout schéma 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 l'expression régulière: 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 première version, les cas de test doivent être un début de ligne pour travailler.

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

Explication de l'expression régulière: https://regexr.com/4kt9n


Si vous pouvez trouver un modèle qui peut échouer, veuillez faire un commentaire, je le corrigerai.

Cas de test: réussite

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

+86, +99, etc. ne sont certainement pas des numéros de téléphone américains. Plusieurs de vos autres cas de test semblent douteux pour d'autres raisons.
tripleee

@tripleee laissez-moi résoudre ce problème, je l'ai mis à jour dans n'importe quel pays, j'espère que cela fonctionne. De plus, j'ai également supprimé les cas de test en double
Kiran Bhattarai

0

Je lance simplement cette réponse car elle résout un de mes problèmes, elle est basée sur la réponse de @ stormy, mais comprend des codes de pays à 3 chiffres et, plus important encore, peut être utilisée n'importe où dans une chaîne, mais ne correspondra pas si ce n'est pas précédé d'un espace / début de la chaîne et se terminant par une limite de mot. Ceci est utile pour ne pas correspondre à des nombres aléatoires au milieu d'une URL ou quelque chose du genre

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.