Проверете телефонните номера с Java Regex

1. Общ преглед

Понякога трябва да проверим текста, за да гарантираме, че съдържанието му съответства на някакъв формат. В този бърз урок ще видим как да проверяваме различни формати на телефонни номера, използвайки регулярни изрази.

2. Регулярни изрази за потвърждаване на телефонни номера

2.1. Десетцифрено число

Нека започнем с прост израз, който ще провери дали числото има десет цифри и нищо друго :

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

Този израз ще позволява числа като 2055550125 .

2.2. Брой с бели пространства, точки или тирета

Във втория пример нека да видим как можем да позволим незадължителни интервали, точки или тирета (-) между числата:

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

За да постигнем тази допълнителна цел (незадължително интервал или тире), просто сме добавили знаците:

  • [-.]?

Този модел ще позволява числа като 2055550125 , 202 555 0125 , 202.555.0125 и 202-555-0125 .

2.3. Брой със скоби

След това нека добавим възможността първата част от телефона ни да е между скобите :

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

За да позволим незадължителните скоби в числото, добавихме следните знаци към нашия регулярен израз:

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

Този израз ще позволява числа като (202) 5550125 , (202) 555-0125 или (202) -555-0125 . Освен това този израз ще позволява и телефонните номера, обхванати в предишния пример.

2.4. Номер с международен префикс

И накрая, нека видим как да разрешим международен префикс в началото на телефонен номер :

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

За да позволим префикса в нашия номер, ние добавихме в началото на нашия модел символите:

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

Този израз ще позволи на телефонните номера да включват международни префикси, като се има предвид, че международните префикси обикновено са числа с максимум три цифри.

3. Прилагане на множество регулярни изрази

Както видяхме, валидният телефонен номер може да приеме няколко различни формата. Поради това може да поискаме да проверим дали нашият низ отговаря на някой от тези формати.

В последния раздел започнахме с прост израз и добавихме повече сложност, за да постигнем целта да обхванем повече от един формат. Понякога обаче не е възможно да се използва само един израз. В този раздел ще видим как да обединим множество регулярни изрази в един .

Ако не сме в състояние да създадем общ регулярен израз, който може да провери всички възможни случаи, които искаме да обхванем, можем да дефинираме различни изрази за всеки от случаите и след това да ги използваме всички заедно, като ги обединим със символ на тръба (|).

Нека да видим пример, където използваме следните изрази:

  • Изразът, използван в последния раздел:
    • ^ (\\ + \\ d {1,3} ()?)? ((\\ (\\ d {3} \\)) | \\ d {3}) [-.]? \\ d { 3} [-.]? \\ d {4} $
  • Регуларен израз, който позволява числа като +111 123 456 789:
    • ^ (\\ + \\ d {1,3} ()?)? (\\ d {3} []?) {2} \\ d {3} $
  • Шаблон за допускане на числа като +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()); } }

Както можем да видим в горния пример, като използваме символа на тръбата, можем да използваме трите израза едновременно, като по този начин ни позволяваме да обхванем повече случаи, отколкото само с един регулярен израз.

4. Заключение

В тази статия видяхме как да проверим дали даден низ съдържа валиден телефонен номер, използвайки различни регулярни изрази. Също така научихме как да използваме множество регулярни изрази едновременно.

Както винаги, пълният изходен код на статията е достъпен в GitHub.