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.
^(\+\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}$
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.
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.
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*$/
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
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
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.
^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$
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
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).
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
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
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
qu'en est-il des nombres multiples avec "+" et séparez-les avec ";" "," "-" ou "" caractères?
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
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}))))
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 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.
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}