Проверка номера телефона

  • 12
  • Недоступна
Метод checkTelNumber должен проверять, является ли аргумент telNumber валидным номером телефона. Критерии валидности: 1) если номер начинается с '+', то он содержит 12 цифр 2) если номер начинается с цифры или открывающей скобки, то он содержит 10 цифр 3) может содержать 0-2 знаков '-', которые не м
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (146)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
ildwine24 уровень
четверг, 16:00
Решил с тремя регулярными выражениями, написанными для случаев: номер начинается со '(', номер начинается с цифры, номер начинается с '+'. Алгоритм такой: 1. Проверил, что строка не равна null и не меньше 10 символов. 2. Посчитал сумму цифр. 3. Если сумма равна 10, первый символ '(' и строка соответствует первой регулярке - true 4. Иначе, если сумма 10, первый символ цифра и и строка соответствует второй регулярке - true 5. Иначе, если сумма 12, первый символ '+' и строка соответствует третьей регурярке - true 6. Иначе false. Пример регулярки для пункта 5: telNumber.matches("^\\+\\d+\\(?\\d{3}\\)?\\d+\\-?\\d+\\-?\\d+\\-?\\d+"). На универсальную регулярку для всех трех случаев пока не сподобился. Но радует, что вообще начал регулярки понимать. Хороший онлайн-сервис для проверки регулярок: https://regex101.com
Иван Сапронов27 уровень
14 марта, 08:45
Однако, на 14.03.19 г. эту задачу решило пока всего 5160 учеников... Между тем, она не такая уж сложная. Нужно просто читать внимательно условия задачи и выполнить соответствующую начальную проверку, которая поможет откинуть лишнее и сделать запись итоговой регулярки более лаконичной:
if(telNumber == null || telNumber.isEmpty()
                || telNumber.matches(".*-{2,}.*") ||
                telNumber.split("")[telNumber.length()-1].matches("\\D")) return false;
P.S. если не ошибаюсь, на каком-то предыдущем уровне уже была какая-то подобная задачка на валидность (или преобразование) телефонного номера.
Dinara25 уровень, Москва
5 апреля, 19:08
Спасибо за идею! Решила, добавив в if проверки остальных требований из условия задачи.
Don Fear25 уровень, Екатеринбург
12 апреля, 06:32
5280
Вадим31 уровень, Новосибирск
2 марта, 17:41
Валик скушал без проверки количества чисел :)
Alexey28 уровень, Минск
1 марта, 12:29
Блин! Проверка передаваемого значения на null уже в подкорке должна быть :) Не первый раз попадаюсь
Илья22826 уровень, Москва
19 февраля, 08:30
спасибо всем на 2 квесте, на уровнях с регуляркой: return telNumber.matches("^(\\+\\d{0,2})?(\\(?\\d{3}\\)?[\\- ]?)([\\d+\\-?]{7,10})$");
S3R3N1TY33 уровень, Санкт-Петербург
27 февраля, 22:19
Валидатор принимает, но условие: 1) если номер начинается с '+', то он содержит 12 цифр
public static void main(String[] args) {
     ArrayList<String> numbers = new ArrayList<>();
     numbers.add("+1234567891");
     for (String num :  numbers){
         System.out.println(num+" "+checkTelNumber(num)); } }
Выдает true, их ведь должно быть именно 12, если начинается с "+"
Vitaly Khan36 уровень
1 марта, 00:55
некорректное регулярное выражение. пропускает много неверных вариантов телефона: +38(050)-1234567 +38050)1234567 +38(050)1---4-5-67
Андрей27 уровень, Самара
16 января, 13:09
Подсчитал сначала количество цифр Pattern pattern = Pattern.compile("\\d"); Matcher matcher = pattern.matcher(telNumber); int q = 0; while (matcher.find()) { q++; }, если 10 то используется одно регулярное выражение, если 12 то другое. ТО у меня получилось 2 условия if и 2 регулярки. Можно и в одну регулярку написать но слишком длинная получается, трудночитаемо.
Дмитрий К.32 уровень, Иркутск
15 февраля, 13:36
можно и классикой
int count = 0;
for (int i = 0; i < telNumber.length(); i++) {
    if (Character.isDigit(telNumber.charAt(i))) count++;
}
if (count != 12)  return false;
RuslanN35 уровень, Нижний Новгород
11 января, 11:22
Ахереть, боже мой , со второй попытки из-за того что не предуусмотрел null ))) я в шоке))
RuslanN35 уровень, Нижний Новгород
11 января, 11:27
Кстати, если что, крайне доступно обьясняет вот этот чувак https://youtu.be/d0sWs2e7rf0
Дмитрий31 уровень, Екатеринбург
20 марта, 15:03
Шикардос!!! Спасибо за наводку!!!
Pavel Soros23 уровень
9 января, 17:00
Из-за NULL и isEmpty() три попытки сжёг.
Иван Зубов31 уровень, Москва
7 января, 20:34
Решил задачу не до конца разобравшись с регулярками, но получилось очень компактно, на мой взгляд. вот ссылка на github: GitHub
Sasha Dmitrieva29 уровень, Москва
11 февраля, 21:25
Номер "(050)1234567" не проходит проверку по регулярке хотя, по-моему, подходит под условие
Леонид32 уровень, Москва
5 марта, 14:49
Вместо + нужно поставить *. Т.к. если номер начинается не с +, он может начаться со скобок, потому \\d в начале может не быть. "\\+?\\d + \\(?\\d{3}\\)?(\\d+-\\d){0,2}\\d+" "\\+?\\d * \\(?\\d{3}\\)?(\\d+-\\d){0,2}\\d+" И наверно символ начала строки ^ не обязателен. Решение красивое. Я сталкиваясь с задачами на регулярки, как в анекдоте из лекции получаю дополнительную проблему)
Илья24 уровень, Москва
18 марта, 00:42
Ты молодец, не хочу критиковать, но ПРОХОДИТ проверку случай, когда +38(0501234567 а все потому, что у тебя скобки могут быть, а могут не быть отдельно друг от друга (то есть одна может быть, в то время как другая может отсутствовать, и наоборот) сгруппировав я получил
telNumber.matches("^\\+?\\d*(\\(\\d{3}\\))?(\\d+-\\d){0,2}\\d+"))
Забавно, что валидатор принял( а мой вариант(доработанный) нет) может где накосячил я
Sasha S28 уровень, Киев
1 января, 14:04
null || isEmpty() ))