Convalida i numeri di telefono con Java Regex

1. Panoramica

A volte, abbiamo bisogno di convalidare il testo per assicurarci che il suo contenuto sia conforme a qualche formato. In questo breve tutorial, vedremo come convalidare diversi formati di numeri di telefono utilizzando espressioni regolari.

2. Espressioni regolari per convalidare i numeri di telefono

2.1. Numero di dieci cifre

Cominciamo con una semplice espressione che controllerà se il numero ha dieci cifre e nient'altro :

@Test public void whenMatchesTenDigitsNumber_thenCorrect() { Pattern pattern = Pattern.compile("^\\d{10}$"); Matcher matcher = pattern.matcher("2055550125"); assertTrue(matcher.matches()); }

Questa espressione consentirà numeri come 2055550125 .

2.2. Numero con spazi bianchi, punti o trattini

Nel secondo esempio, vediamo come possiamo consentire spazi bianchi, punti o trattini (-) opzionali tra i numeri:

@Test public void whenMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect() { Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$"); Matcher matcher = pattern.matcher("202 555 0125"); assertTrue(matcher.matches()); }

Per raggiungere questo obiettivo extra (spazio bianco o trattino opzionale), abbiamo semplicemente aggiunto i caratteri:

  • [-.]?

Questo modello consentirà numeri come 2055550125 , 202555 0125 , 202.555.0125 e 202-555-0125 .

2.3. Numero con parentesi

Successivamente, aggiungiamo la possibilità di avere la prima parte del nostro telefono tra parentesi :

@Test public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() { Pattern pattern = Pattern.compile"^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"); Matcher matcher = pattern.matcher("(202) 555-0125"); assertTrue(matcher.matches()); }

Per consentire la parentesi facoltativa nel numero, abbiamo aggiunto i seguenti caratteri alla nostra espressione regolare:

  • (\\ (\\ d {3} \\)) | \\ d {3})

Questa espressione consentirà numeri come (202) 5550125 , (202) 555-0125 o (202) -555-0125 . Inoltre, questa espressione consentirà anche i numeri di telefono trattati nell'esempio precedente.

2.4. Numero con prefisso internazionale

Infine, vediamo come consentire un prefisso internazionale all'inizio di un numero di telefono :

@Test public void whenMatchesTenDigitsNumberPrefix_thenCorrect() { Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"); Matcher matcher = pattern.matcher("+111 (202) 555-0125"); assertTrue(matcher.matches()); } 

Per consentire il prefisso nel nostro numero, abbiamo aggiunto all'inizio del nostro modello i caratteri:

  • (\\ + \\ d {1,3} ()?)?

Questa espressione consentirà ai numeri di telefono di includere prefissi internazionali, tenendo conto che i prefissi internazionali sono normalmente numeri con un massimo di tre cifre.

3. Applicazione di più espressioni regolari

Come abbiamo visto, un numero di telefono valido può assumere diversi formati. Pertanto, potremmo voler verificare se la nostra stringa è conforme a uno qualsiasi di questi formati.

Nell'ultima sezione, abbiamo iniziato con una semplice espressione e aggiunto una maggiore complessità per raggiungere l'obiettivo di coprire più di un formato. Tuttavia, a volte non è possibile utilizzare una sola espressione. In questa sezione vedremo come unire più espressioni regolari in una sola .

Se non siamo in grado di creare un'espressione regolare comune che possa convalidare tutti i casi possibili che vogliamo coprire, possiamo definire espressioni diverse per ciascuno dei casi e quindi usarle tutte insieme concatenandole con un simbolo pipe (|).

Vediamo un esempio in cui usiamo le seguenti espressioni:

  • L'espressione usata nell'ultima sezione:
    • ^ (\\ + \\ d {1,3} ()?)? ((\\ (\\ d {3} \\)) | \\ d {3}) [-.]? \\ d { 3} [-.]? \\ d {4} $
  • Espressione regolare per consentire numeri come +111 123 456 789:
    • ^ (\\ + \\ d {1,3} ()?)? (\\ d {3} []?) {2} \\ d {3} $
  • Modello per consentire numeri come +111 123 45 67 89:
    • ^ (\\ + \\ d {1,3} ()?)? (\\ d {3} []?) (\\ d {2} []?) {2} \\ d {2} $
@Test public void whenMatchesPhoneNumber_thenCorrect() { String patterns = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$" + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$"; String[] validPhoneNumbers = {"2055550125","202 555 0125", "(202) 555-0125", "+111 (202) 555-0125", "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"}; Pattern pattern = Pattern.compile(patterns); for(String phoneNumber : validPhoneNumbers) { Matcher matcher = pattern.matcher(phoneNumber); assertTrue(matcher.matches()); } }

Come possiamo vedere nell'esempio sopra, usando il simbolo pipe, possiamo usare le tre espressioni in una volta, permettendoci così di coprire più casi che con una sola espressione regolare.

4. Conclusione

In questo articolo, abbiamo visto come verificare se una stringa contiene un numero di telefono valido utilizzando espressioni regolari diverse. Abbiamo anche imparato come utilizzare più espressioni regolari contemporaneamente.

Come sempre, il codice sorgente completo dell'articolo è disponibile su GitHub.