Überprüfen Sie Telefonnummern mit Java Regex

1. Übersicht

Manchmal müssen wir Text validieren, um sicherzustellen, dass sein Inhalt einem bestimmten Format entspricht. In diesem kurzen Tutorial erfahren Sie, wie Sie verschiedene Formate von Telefonnummern mithilfe regulärer Ausdrücke überprüfen.

2. Reguläre Ausdrücke zur Validierung von Telefonnummern

2.1. Zehnstellige Nummer

Beginnen wir mit einem einfachen Ausdruck, der prüft, ob die Zahl zehn Ziffern hat und sonst nichts :

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

Dieser Ausdruck erlaubt Zahlen wie 2055550125 .

2.2. Zahl mit Leerzeichen, Punkten oder Bindestrichen

Im zweiten Beispiel wollen wir sehen, wie wir optionale Leerzeichen, Punkte oder Bindestriche (-) zwischen den Zahlen zulassen können:

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

Um dieses zusätzliche Ziel zu erreichen (optionales Leerzeichen oder Bindestrich), haben wir einfach die folgenden Zeichen hinzugefügt:

  • [-.]?

Dieses Muster erlaubt Zahlen wie 2055550125 , 202 555 0125 , 202.555.0125 und 202-555-0125 .

2.3. Nummer mit Klammern

Als nächstes fügen wir die Möglichkeit hinzu, den ersten Teil unseres Telefons in Klammern zu setzen :

@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()); }

Um die optionale Klammer in der Zahl zuzulassen, haben wir unserem regulären Ausdruck die folgenden Zeichen hinzugefügt:

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

Dieser Ausdruck erlaubt Zahlen wie (202) 5550125 , (202) 555-0125 oder (202) -555-0125 . Darüber hinaus ermöglicht dieser Ausdruck auch die im vorherigen Beispiel behandelten Telefonnummern.

2.4. Nummer mit internationalem Präfix

Lassen Sie uns abschließend sehen, wie Sie ein internationales Präfix am Anfang einer Telefonnummer zulassen :

@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()); } 

Um das Präfix in unserer Nummer zuzulassen, haben wir am Anfang unseres Musters die folgenden Zeichen hinzugefügt:

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

Mit diesem Ausdruck können Telefonnummern internationale Präfixe enthalten, wobei berücksichtigt wird, dass internationale Präfixe normalerweise Nummern mit maximal drei Ziffern sind.

3. Anwenden mehrerer regulärer Ausdrücke

Wie wir gesehen haben, kann eine gültige Telefonnummer verschiedene Formate annehmen. Daher möchten wir möglicherweise überprüfen, ob unser String einem dieser Formate entspricht.

Im letzten Abschnitt haben wir mit einem einfachen Ausdruck begonnen und mehr Komplexität hinzugefügt, um das Ziel zu erreichen, mehr als ein Format abzudecken. Manchmal ist es jedoch nicht möglich, nur einen Ausdruck zu verwenden. In diesem Abschnitt erfahren Sie, wie Sie mehrere reguläre Ausdrücke zu einem einzigen verbinden .

Wenn wir keinen gemeinsamen regulären Ausdruck erstellen können, der alle möglichen Fälle validieren kann, die wir abdecken möchten, können wir für jeden Fall unterschiedliche Ausdrücke definieren und sie dann alle zusammen verwenden, indem wir sie mit einem Pipe-Symbol (|) verketten.

Sehen wir uns ein Beispiel an, in dem wir die folgenden Ausdrücke verwenden:

  • Der im letzten Abschnitt verwendete Ausdruck:
    • ^ (\\ + \\ d {1,3} ()?)? ((\\ (\\ d {3} \\)) | \\ d {3}) [-.]? \\ d { 3} [-.]? \\ d {4} $
  • Regulärer Ausdruck, um Zahlen wie +111 123 456 789 zuzulassen :
    • ^ (\\ + \\ d {1,3} ()?)? (\\ d {3} []?) {2} \\ d {3} $
  • Muster, um Zahlen wie +111 123 45 67 89 zuzulassen :
    • ^ (\\ + \\ 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()); } }

Wie wir im obigen Beispiel sehen können, können wir mithilfe des Pipe-Symbols die drei Ausdrücke auf einmal verwenden, sodass wir mehr Fälle als nur einen regulären Ausdruck abdecken können.

4. Fazit

In diesem Artikel haben wir gesehen, wie Sie mithilfe verschiedener regulärer Ausdrücke überprüfen können, ob eine Zeichenfolge eine gültige Telefonnummer enthält. Wir haben auch gelernt, wie man mehrere reguläre Ausdrücke gleichzeitig verwendet.

Wie immer ist der vollständige Quellcode des Artikels auf GitHub verfügbar.