web-dev-qa-db-fra.com

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

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, je suis venu avec 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 chèque en pointillé. Je souhaite également savoir s’il est possible d’écrire une seule expression à la place des quatre expressions différentes correspondant aux différents formats que j’ai mentionnés. Si c'est le cas, je ne suis pas sûr de savoir comment faire cela. Et aussi comment modifier l'expression/les expressions pour pouvoir également inclure une condition permettant de 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.

85
noobcoder
^(\+\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 avec des numéros non américains, utilisez

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

Mettre à jour :
Comme l’a remarqué l'utilisateur Simon Weaver ci-dessous, si vous souhaitez également faire correspondre des nombres non formatés, il suffit de rendre la classe de caractères de séparation facultative en tant que [\s.-]?.

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

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

Quel que soit le mode de saisie du numéro de téléphone, 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.

  • Groupe 1: code pays (ex: 1 ou 86)
  • Groupe 2: Code régional (ex: 800)
  • Group3: Exchange (ex: 555)
  • Groupe 4: 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.

95
Francis Gagnon

En ajoutant un exemple utilisant les solutions mentionnées ci-dessus sur jsfiddle ..__, j'ai légèrement modifié le code selon les besoins 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

6
Avinash Lad

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é contre les 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
4
Puneet Lamba

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

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

Testé contre les cas d'utilisation suivants.

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

Que dis-tu de ça?

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

EDIT: J'ai oublié le () ..... EDIT 2: Vous avez mal compris les 3 premiers chiffres.

2
crimson_penguin

^(\+\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

2
stomy

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

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

Notez qu'en fonction de la langue et de la marque des expressions rationnelles utilisées, vous devrez peut-être insérer \2 au lieu de $2, sinon une telle correspondance pourrait ne pas être prise en charge.

Je ne vois aucun moyen de combiner cela avec le format 2, mis à part l'évident ^(regex for 1,3,4|regex for 2)$, qui est moche, maladroit et rend difficile la compréhension des parties des nombres.

En ce qui concerne 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
Vedran Šego

Ce code correspondra à un numéro de téléphone américain ou canadien et permettra également de s’assurer qu’il s’agit d’un code régional valide.

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

Test sur Regex101.com

2
Shino

Modèle de regex pour valider un numéro de téléphone régulier à 10 chiffres plus un code international facultatif (1 à 3 chiffres) et un numéro de poste facultatif (un nombre quelconque 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
2
bocanegra

Peut-être le plus facile compare-t-il à plusieurs autres.

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

Cela correspond à ce qui suit:

(555) 444-6789 

555-444-6789

555.444.6789 

555 444 6789

1
MITHU

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

0
radeveloper

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

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

Explication: 

 enter image description here

0
Amitesh

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
Kelly Milligan

Ceci est une version plus complète qui correspondra à la mesure de ce que je peux imaginer et vous donne également une correspondance de groupe pour le pays, la région, la première et la dernière. 

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

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

En particulier:

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

Il existe quelques autres restrictions, notamment les blocs réservés (N9X, 37X, 96X) et 555, mais je les ai laissées de côté, notamment parce que les blocs réservés pourraient être utilisés ultérieurement, et 555 est utile pour les tests.

Voici ce que je suis venu avec:

^((\+\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 réponses 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 non valides 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 groupement pour extraire les groupes de chiffres, mais il peut être modifié pour les inclure.

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