Необязательно в java-regex для номера мобильного телефона

Я изучаю регулярное выражение Java и в программе ниже для элемента списка [4], который я ожидаю "Its a valid number : +11234562222", но он печатает как недействительный. Я сделал - необязательным в регулярном выражении (\\+\\d{1,2}-?). Может ли кто-нибудь указать, чего не хватает в этом коде?

Токовый выход

> Its a valid number : 123-456-2222
Its a valid number : +1-123-456-2222
Its a valid number : 1234562222
Its a invalid number : 12345622226
Its a invalid number : +11234562222

Ожидаемый результат

> Its a valid number : 123-456-2222
Its a valid number : +1-123-456-2222
Its a valid number : 1234562222
Its a invalid number : 12345622226
Its a valid number : +11234562222

public static void vali_mobile_num(){

String mob_pat = "^(\\+\\d{1,2}-?)?+(\\d{3}-?){2}+\\d{4}$";
List list = new ArrayList();

list.add( "123-456-2222");
list.add("+1-123-456-2222");
list.add("1234562222");
list.add("12345622226");
list.add("+11234562222");

Pattern p = Pattern.compile(mob_pat);

list.forEach(x -> {
    Matcher m = p.matcher(x.toString());
    if (m.find()){
        System.out.println("Its a valid number : "+m.group());
    }
    else
        System.out.println("Its a invalid number : "+ x);   

});

}

Посмотрите на свое выражение: первая необязательная группа соответствует +11. Далее у вас есть 2 группы из 3 цифр, за которыми может следовать знак минус. Таким образом, они будут соответствовать 234 и 562. Наконец, вы ожидаете группу из 4 цифр, но в строке осталось только 222. Почему 1234562222 совпадает? Потому что первая необязательная группа, содержащая \+, не совпадает, поэтому 123, 456 и 2222 остаются для соответствия другим группам.

Thomas 31.01.2019 17:16

Вы должны придерживаться соглашений об именах Java: имена методов пишутся в camelCase, что означает отсутствие подчеркивания. Например. vali_mobile_num должен быть validateMobileNum.

MC Emperor 31.01.2019 17:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваше регулярное выражение почти в порядке, за исключением того, что у вас есть дополнительный +, я не понимаю, почему. Просто удалите это, и все в порядке.

^(\\+\\d{1,2}-?)?+(\\d{3}-?){2}+\\d{4}$
                 ^ is not needed

Попробуйте этот код Java,

List<String> list = Arrays.asList("123-456-2222","+1-123-456-2222","1234562222","12345622226","+11234562222");
Pattern p = Pattern.compile("^(\\+\\d{1,2}-?)?(\\d{3}-?){2}+\\d{4}$");

list.forEach(x -> {
    Matcher m = p.matcher(x);
    if (m.matches()) {
        System.out.println(x + " is Valid");
    } else {
        System.out.println(x + " is Invalid");
    }
});

Принты,

123-456-2222 is Valid
+1-123-456-2222 is Valid
1234562222 is Valid
12345622226 is Invalid
+11234562222 is Valid

Другие вопросы по теме