Регулярные выражения Java: проверяем номер телефона

В этом уроке мы рассмотрим, как проверить номер телефона в Java с помощью регулярных выражений (RegEx).
Телефонные номера трудно проверить. Разные страны имеют разные форматы, а некоторые страны даже используют несколько форматов и кодов стран.
Чтобы проверить номер телефона с помощью регулярных выражений, вам придется написать пару утверждений.
Эти утверждения зависят от вашего проекта, его локализации и стран, в которых вы хотите его применить.
Для стандартной проверки номера телефона в США мы можем использовать длинное, довольно надежное выражение:
^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$
4 группы в выражении соответствуют коду страны, номеру региона, номеру абонента и добавочному номеру.
123-456-7890
(123) 456-7890
etc...
Вы можете написать другое выражение, введя набор правил для групп (в зависимости от страны) и форматов.
Pattern simplePattern = Pattern.compile("^\\+\\d{10,12}$");
Pattern robustPattern = Pattern.compile("^(\\+\\d{1,2}\\s)?\\(?\\d{3}\\)?[\\s.-]?\\d{3}[\\s.-]?\\d{4}$");
String phoneNumber = "+12 345 678 9012";
Matcher simpleMatcher = simplePattern.matcher(phoneNumber);
Matcher robustMatcher = robustPattern.matcher(phoneNumber);
if (simpleMatcher.matches()) {
System.out.println(String.format("Simple Pattern matched for string: %s", phoneNumber));
}
if(robustMatcher.matches()) {
System.out.println(String.format("Robust Pattern matched for string: %s", phoneNumber));
}
Robust Pattern matched for string: +12 345 678 9012
Совпадения здесь могли бы соответствовать нескольким форматам:
Pattern robustPattern = Pattern.compile("^(\\+\\d{1,2}\\s)?\\(?\\d{3}\\)?[\\s.-]?\\d{3}[\\s.-]?\\d{4}$");
List<String> phoneNumbers = List.of(
"+12 345 678 9012",
"+123456789012",
"345.678.9012",
"345 678 9012"
);
for (String number : phoneNumbers) {
Matcher matcher = robustPattern.matcher(number);
if(matcher.matches()) {
System.out.println(String.format("Robust Pattern matched for string: %s", number));
}
}
Результат:
Robust Pattern matched for string: +12 345 678 9012
Robust Pattern matched for string: 345.678.9012
Robust Pattern matched for string: 345 678 9012
Объединяем несколько регулярных выражений
Вместо единого универсального надежного регулярного выражения, охватывающего все крайние случаи, страны и т.д., вы можете выбрать несколько различных шаблонов, которые будут охватывать входящие телефонные номера. Чтобы упростить задачу – вы можете связать эти выражения с помощью оператора | , чтобы проверить, соответствует ли номер телефона какому-либо из шаблонов:
Pattern robustPattern = Pattern
.compile(
// Robust expression from before
"^(\\+\\d{1,2}\\s)?\\(?\\d{3}\\)?[\\s.-]?\\d{3}[\\s.-]?\\d{4}$"
// Area code, within or without parentheses,
// followed by groups of 3-4 numbers with or without hyphens
+ "| ((\\(\\d{3}\\) ?)|(\\d{3}-))?\\d{3}-\\d{4}"
// (+) followed by 10-12 numbers
+ "|^\\+\\d{10,12}"
);
List<String> phoneNumbers = List.of(
"+12 345 678 9012",
"+123456789012",
"345.678.9012",
"345 678 9012"
);
for (String number : phoneNumbers) {
Matcher matcher = robustPattern.matcher(number);
if(matcher.matches()) {
System.out.println(String.format("Pattern matched for string: %s", number));
}
}
Результат:
Pattern matched for string: +12 345 678 9012
Pattern matched for string: +123456789012
Pattern matched for string: 345.678.9012
Pattern matched for string: 345 678 9012
Заключение
Регулярные выражения могут решить проблему проверки телефонных номеров, но это сложно.
Некоторые страны придерживаются разных стандартов, в то время как некоторые страны принимают и используют несколько форматов одновременно. Это затрудняет написание выражения общего назначения для универсального соответствия телефонным номерам.
В этой статье мы рассмотрели, как сопоставлять телефонные номера с регулярными выражениями в Java, используя несколько различных выражений.