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

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

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

dove # indica qualsiasi numero. Finora ho trovato 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 del tutto sicuro se l’ultimo è corretto per il controllo puntato. Voglio anche sapere se c’è un modo in cui potrei scrivere una singola espressione invece dei 4 diversi che soddisfano i diversi formati che ho citato. Se è così, non sono sicuro di come lo faccio. E anche come modifico le espressioni / espressioni in modo che possa includere anche una condizione per supportare il prefisso come componente opzionale. Qualcosa di simile a

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

dove +1 è il prefisso ed è opzionale.

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

Corrisponde al seguente

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

Se non si desidera utilizzare una corrispondenza su numeri non statunitensi

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

Aggiornare :
Come notato dall’utente Simon Weaver in basso, se sei interessato anche alla corrispondenza su numeri non formattati, rendi opzionale la class di caratteri separatore come [\s.-]?

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

Ci sono molte varianti possibili 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 dal modo in cui viene inserito il numero di telefono, i gruppi di cattura possono essere utilizzati per suddividere il numero di telefono in modo da poterlo elaborare nel codice.

  • Gruppo 1: codice paese (es: 1 o 86)
  • Gruppo 2: prefisso (es: 800)
  • Gruppo 3: scambio (ex: 555)
  • Gruppo4: numero di sottoscrizione (es: 1234)
  • Gruppo 5: estensione (es: 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, basta aggiungere un punto interrogativo dopo il (\ d {3}) per il prefisso.

Aggiungendo un esempio usando le soluzioni sopra menzionate su jsfiddle. Ho modificato il codice un po ‘come richiesto dai miei clienti. Spero che questo aiuti anche qualcuno.

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

Vedi l’esempio qui

Ecco una cosa abbastanza compatta che ho creato.

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

Testato contro i 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 

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

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

Si noti che, a seconda della lingua e del marchio delle regex utilizzate, potrebbe essere necessario inserire \2 anziché $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, maldestro e rende difficile ottenere le parti dei numeri.

Per quanto riguarda il prefisso, è ansible aggiungere (\+\d)? all’inizio per acquisire un prefisso a una cifra (scusate, non conosco il formato dei vostri prefissi).

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: ha sbagliato la prima parte di 3 cifre.

prova questo per gli utenti pakistani. Ecco un modello abbastanza compatto che ho creato.

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

Testato contro i seguenti casi d’uso.

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

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

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

Test su Regex101.com

Regex patter per convalidare un normale numero di telefono a 10 cifre più codice internazionale opzionale (da 1 a 3 cifre) e 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 

Numero di telefono regex che uso: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

copertine:

  • 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
 ^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4} 

Iniziando con la 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 lasciati fuori, soprattutto perché i blocchi riservati potrebbero vedere l’uso futuro e 555 è utile per il test.

Questo è quello che mi è venuto in mente:

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

In alternativa, se vuoi anche abbinare valori vuoti (se il campo non è richiesto), puoi usare:

 (^((\+\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 della 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 modificato per includerli.

Questa è una versione più completa che combacerà per quanto posso pensare e ti darà una corrispondenza di gruppo per paese, regione, prima e ultima.

 (?(\+?(?(\d{1,3}))(\s|-|\.)?)?(\(?(?(\d{3}))\)?(\s|-|\.)?)((?(\d{3}))(\s|-|\.)?)((?(\d{4})))) 

Forse il più facile si confronta con molti altri.

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

Corrisponde al seguente:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789

che dire di più numeri con “+” e separarli con “;” “,” “-” o “” caratteri?

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 per permettere cose come i numeri olandesi, per esempio

+358 300 20200