Espressione regolare per abbinare il numero di telefono standard a 10 cifre


125

Voglio scrivere un'espressione regolare per un numero di telefono di tipo statunitense standard che supporti i seguenti formati:

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

dove # significa qualsiasi numero. Finora sono venuto fuori con le seguenti espressioni

^[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}

rispettivamente. Non sono abbastanza sicuro che l'ultimo sia corretto per il segno di spunta. Voglio anche sapere se c'è un modo in cui potrei scrivere una singola espressione invece delle 4 diverse che si adattano ai diversi formati che ho citato. Se è così, non sono sicuro di come farlo. E anche come modifico l'espressione / espressioni in modo da poter includere anche una condizione per supportare il prefisso come componente opzionale. Qualcosa di simile a

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

dove +1 è il prefisso ed è facoltativo.


5
possibile duplicato di stackoverflow.com/questions/123559/… la risposta suggerita è di eliminare ogni carattere non numerico. In questo modo, semplifichi la convalida
Arnaud Denoyelle

1
So che è stato un po 'di tempo fa, ma non credo che i prefissi degli Stati Uniti possano iniziare con 1. (123) 456-7890 non sarebbero validi a causa del primo 1.
bobanahalf

Per una risposta corretta più completa, consultare: stackoverflow.com/a/18626090/561710
Joe Johnston,

L'analisi dei numeri di telefono è difficile. Google ha rilasciato una libreria open source per questo. Aiutati, usa libphonenumber (o un fork nella tua lingua)
aloisdg si trasferisce su codidact.com il

Risposte:


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

Corrisponde a quanto segue

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

Se non vuoi una corrispondenza sui numeri non statunitensi usa

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

Aggiornamento:
come notato di seguito dall'utente Simon Weaver, se sei interessato anche alla corrispondenza su numeri non formattati, rendi la classe del carattere separatore opzionale come[\s.-]?

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

1
Pensi che il punto interrogativo non sia necessario in (? \ D {3}) parte della tua primissima riga? Penso che abbiamo bisogno di una o più occorrenze e non di zero o una occorrenza di una cifra all'interno di "(" e ")"
noobcoder

2
Il ?là si applica alle parentesi (), non alle cifre. La regex correlata completa è \(?\d{3}\)?. \d{3}specifica che devono esserci tre cifre tra quelle ()che sono (rese) facoltative (da ?).
Ravi Thapliyal

6
nota: questo non corrisponde a 1234567890 che potrebbe o non potrebbe essere un problema. per me era - quindi ho aggiunto solo ?dopo ogni [\s.-]per renderlo opzionale
Simon_Weaver

1
@Simon_Weaver Grazie per i tuoi input. Ho aggiunto la tua osservazione alla risposta.
Ravi Thapliyal

3
Se ne vuoi uno che eviti il ​​problema menzionato da @BobRay, usa ^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$. (Fondamentalmente ho appena duplicato il segmento della RegEx che copre il prefisso e ha consentito una variante con parentesi e una senza)
Shrey Gupta

129

Sono possibili molte varianti per questo problema. Ecco un'espressione regolare simile a una risposta che ho inserito in precedenza su SO.

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

Corrisponderebbe ai seguenti esempi e molto altro:

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

Indipendentemente dalla modalità di immissione del numero di telefono, i gruppi di acquisizione possono essere utilizzati per suddividere il numero di telefono in modo da poterlo elaborare nel codice.

  • Gruppo 1: codice paese (es: 1 o 86)
  • Gruppo2: Prefisso (es: 800)
  • Gruppo 3: Exchange (ex: 555)
  • Gruppo4: numero abbonato (es: 1234)
  • Gruppo5: Estensione (ex: 5678)

Ecco una ripartizione dell'espressione se sei interessato:

^\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.

Per rendere facoltativo il prefisso locale, aggiungi semplicemente un punto interrogativo dopo (\ d {3}) per il prefisso.


8
migliore risposta IMHO. Per il mio scopo, \sall'inizio e alla fine non sono necessari, perché lo sto usando per la convalida e il campo è già tagliato.
Daniel

2
Di gran lunga la risposta migliore e più completa. Apprezzo molto anche la ripartizione delle espressioni regolari.
Bryant Jackson

@Kondal Sono curioso dell'input che stai utilizzando per farlo fallire. Sembra funzionare bene per me con uno 0 per il codice del paese.
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 * $ "solo -numbers ng-maxlength = "10" />
Kondal

@Kondal Sorry. Intendevo il testo che stai cercando di abbinare che non riesce con questa regex.
Francis Gagnon

8

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

Corrisponde a questi numeri di telefono:

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

Vedi regex101.com


7

Eccone uno abbastanza compatto che ho creato.

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

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

Testato rispetto ai seguenti casi d'uso.

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

Questo corrisponde a cose come (800444-4444
Jake

6

Aggiungendo un esempio utilizzando le soluzioni sopra menzionate su jsfiddle. Ho modificato leggermente il codice secondo le esigenze dei miei clienti. Spero che questo aiuti anche qualcuno.

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

Vedi esempio qui


4

prova questo per gli utenti pakistani. Eccone uno abbastanza compatto che ho creato.

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

Testato rispetto ai seguenti casi d'uso.

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

4

Espressione regolare del numero di telefono che utilizzo: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

Teloni:

  • 18001234567
  • 1800123 4567
  • +1800123-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

2

Le espressioni per 1, 3 e 4 sono abbastanza simili, quindi puoi usare:

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

Tieni presente che, a seconda della lingua e della marca delle espressioni regolari utilizzate, potresti dover inserire al \2posto di$2 o tale corrispondenza potrebbe non essere supportata affatto.

Non vedo un buon modo per combinare questo con il formato 2, a parte l'ovvio ^(regex for 1,3,4|regex for 2)$ che è brutto, goffo e rende difficile tirare fuori le parti dei numeri.

Per quanto riguarda il prefisso, puoi aggiungere (\+\d)?all'inizio per acquisire un prefisso di una sola cifra (mi dispiace, non conosco il formato dei tuoi prefissi).


2

Cosa ne pensi di questo?

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

EDIT: mi sono dimenticato di quello (). EDIT 2: hai sbagliato la prima parte a 3 cifre.


Non è necessario eseguire l'escape del punto .quando si è in una classe di caratteri, quindi [-\.\s]dovrebbe essere effettivamente [-.\s], perché non vogliamo trovare la corrispondenza con una barra rovesciata.
Vedran Šego

Corrisponderebbe effettivamente al backslash? Ho pensato che potrebbe non essere necessario, ma non ero sicuro al 100%.
crimson_penguin

Hai ragione. L'ho appena provato (non ho mai avuto bisogno di una barra rovesciata prima) [\.]ed [.]entrambi corrispondono solo al punto, mentre [\\.]corrispondono sia al punto che al backslash. Grazie per il tuo commento.
Vedran Šego

La mia opinione sulle espressioni regolari è che, se stai dando una regex a qualcuno, accompagnala sempre con una spiegazione, altrimenti la regex è inutile. Solo la mia opinione.
John Red

2

Partendo dalla risposta di @ Ravi, ho anche applicato alcune regole di convalida per il codice NPA (Area) .

In particolare:

  • Dovrebbe iniziare con un 2 (o superiore)
  • Non può avere "11" come seconda e terza cifra (N11).

Ci sono un paio di altre restrizioni, inclusi i blocchi riservati (N9X, 37X, 96X) e 555, ma li ho tralasciati, in particolare perché i blocchi riservati potrebbero essere utilizzati in futuro e 555 è utile per i test.

Questo è quello che ho pensato:

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

In alternativa, se desideri far corrispondere anche valori vuoti (se il campo non è obbligatorio), puoi utilizzare:

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

I miei casi di test per numeri validi (molti dalla risposta di @Francis) sono:

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

I miei casi di test non validi includono:

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

La mia espressione regolare non include il raggruppamento per estrarre i gruppi di cifre, ma può essere modificata per includerli.


2

Forse il più semplice rispetto a molti altri.

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

Corrisponde a quanto segue:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789


Perfetto ... Grazie (y)
Sushil Sharma

2

Questo codice corrisponderà a un numero di telefono statunitense o canadese e si assicurerà inoltre che si tratti di un prefisso e di uno scambio valido:

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

Prova su Regex101.com


2

Regex patter per convalidare un normale numero di telefono a 10 cifre più un codice internazionale opzionale (da 1 a 3 cifre) e un numero di interno opzionale (qualsiasi numero di cifre):

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

Demo: https://www.regextester.com/103299

Voci valide:

/* 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

Trovo questa espressione regolare molto utile per me per il numero di contatto a 10 cifre:

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

Riferimento : https://regex101.com/r/QeQewP/1

Spiegazione:

inserisci qui la descrizione dell'immagine


Hai usato uno strumento per generare quella spiegazione? Condividi! Grazie
sconosciuto

@unnknown Sembra uno screenshot di un controllo regex online, come regex101.com. Si noti che le linee guida SO affermano che tutto il testo, il codice, i dati ei messaggi di errore devono essere inseriti in formato testo, non immagini, perché il testo nelle immagini può essere difficile da leggere, in particolare sui dispositivi mobili, e richiede una maggiore larghezza di banda. Inoltre il testo non può essere copiato e incollato. In questo caso, i colori potrebbero aggiungere qualcosa, non sono sicuro. Sappi che in generale, "Risposte" dovrebbe includere una spiegazione testuale. Amitesh: sarebbe utile includere un link a questo sito, con la tua regex già popolata affinché i visitatori possano sperimentare.
SherylHohman

@unnknown ecco un collegamento che produce un'immagine simile a quella in questo post. La stringa regex di Amitesh è già stata incollata. Puoi inserire numeri di telefono per testarne i risultati: regex101.com/r/QeQewP/1
SherylHohman

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

0

Questa è una versione più completa che corrisponderà a quanto mi viene in mente e ti darà la corrispondenza di gruppo per paese, regione, primo e ultimo.

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

0

che dire di più numeri con "+" e separarli con ";" Caratteri "," "-" o ""?


0

Ho finito con

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

questo era per consentire cose come i numeri olandesi, per esempio

+358300 20200


0

Sopra la regex c'è una leggera modifica di @Francis Gagnon.

Obiettivo: per rilevare qualsiasi modello possibile, un utente può condividere il proprio numero di telefono statunitense


Versione 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*$

Provalo qui Codepen: https://codepen.io/kiranbhattarai/pen/NWKMXQO

Spiegazione della regex: https://regexr.com/4kt5j


Versione 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*$

Cosa c'è dentro: i casi di test possono essere una parte della stringa. Nella versione uno i casi di test dovrebbero essere l'inizio di una linea su cui lavorare.

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

Spiegazione della regex: https://regexr.com/4kt9n


Se riesci a trovare un pattern che può fallire, per favore fai un commento lo aggiusterò.

Casi di test: superato

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 ecc. Non sono sicuramente numeri di telefono statunitensi. Molti degli altri tuoi casi di test sembrano dubbi per altri motivi.
tripleee

@ tripleee lasciami risolvere il problema, l'ho aggiornato a qualsiasi paese spero che funzioni. Inoltre ho rimosso anche i casi di test duplicati
Kiran Bhattarai,

0

Sto solo inserendo questa risposta perché risolve un mio problema, si basa sulla risposta di @ stormy, ma include codici paese a 3 cifre e, cosa più importante, può essere utilizzata ovunque in una stringa, ma non corrisponde se non lo è preceduto da uno spazio / inizio della stringa e termina con un confine di parola. Questo è utile in modo che non corrisponda a numeri casuali nel mezzo di un URL o qualcosa del genere

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.