Как применить проверку номера телефона?
Решаю задачу, в ней есть метод аddCustomer. Этот метод формирует строку из данных клиента (имя, фамилия, почта, телефон) и добавляет ее в коллекцию HashMap. Сейчас он проверяет на ошибки, длину строки и, что бы ввод данных был через пробел. Но мне надо, что бы он заодно проверял и соответствие вводимого номера телефона установленному формату.
Вопрос в том, как правильно применить в этом методе регулярное выражение, чтобы метод проверял, правильно ли введен номер, ну и как следствие, чтобы я мог в случае ошибки добавить его в исключение и программа не вылетала. Шаблон для номера я написал, но как-то в метод вставил коряво.
public CustomerStorage() {
storage = new HashMap<>();
}
public void addCustomer(String data) {
final int INDEX_NAME = 0;
final int INDEX_SURNAME = 1;
final int INDEX_EMAIL = 2;
final String INDEX_PHONE = String.valueOf(3);
Pattern pattern = Pattern.compile("^(\\+7)([0-9]{10})$");
Matcher matcher = pattern.matcher(INDEX_PHONE);
String[] components = data.split("\\s+");
if(components.length !=4)
{
throw new IllegalArgumentException("Неверный формат. Верный формат: \n" +
"add Имя Фамилия [email protected] +71234567890");
}
String name = components[INDEX_NAME] + " " + components[INDEX_SURNAME];
storage.put(name, new Customer(name, components[Integer.parseInt(INDEX_PHONE)], components[INDEX_EMAIL]));
}
Ответы (2 шт):
Я не понял,но где непосредственно вы в своем коде проверяете номер телефона? где метод find()?
Pattern regex = Pattern.compile("\\(?\\b([0-9]{3})\\)?[-.•]?([0-9]{3})[-.•]?([0-9]{4})\\b");
Matcher regexMatcher = regex.matcher(inString);
Strng numer="";
while (regexMatcher.find()) {
numer = regexMatcher.group();// проверяем в строке наличие номера телефона
}
System.out.println(numer)
В своём коде вы сопоставляете с шаблоном индекс телефона в исходной строке, а не саму подстроку. Кроме того, проверка шаблона при помощи Matcher::matches/Matcher::findтак и не вызывается.
И наконец, преобразовывать строку из 11 цифр в тип int для хранения номера телефона -- более чем странная идея, так как максимальное значение составляет Integer.MAX_VALUE = 2147483647, и этого типа данных явно не хватит для хранения любых значений даже без учёта начальной 7 в коде страны.
Для проверки строки на определенный формат достаточно использовать метод String::matches, отдельная регулярка не требуется.
public void addCustomer(String data) {
final int INDEX_NAME = 0;
final int INDEX_SURNAME = 1;
final int INDEX_EMAIL = 2;
final int INDEX_PHONE = 3;
final String PHONE_TEMPLATE = "+7\\d{10}";
String[] components = data.split("\\s+");
if (components.length != 4) {
throw new IllegalArgumentException("Неверный формат. Верный формат: \n" +
"add Имя Фамилия [email protected] +71234567890");
}
String phone = components[INDEX_PHONE];
if (!phone.matches(PHONE_TEMPLATE)) {
throw new IllegalArgumentException("Неверный формат телефона в строке " + phone);
}
String name = components[INDEX_NAME] + " " + components[INDEX_SURNAME];
storage.put(name, new Customer(name, phone, components[INDEX_EMAIL]));
}