Проверка номера телефона не должна выполняться для всех номеров - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь написать регулярное выражение, где он должен потерпеть неудачу, если все номера указаны в качестве номера телефона.Когда я снабжен вводом ниже, он проходит проверку.999.999.9999 или 999-999-9999 или 999 999 9999.Любое предложение по шаблону регулярных выражений о том, как проваливать проверку, содержало все те же числа.

    private static boolean validatePhoneNumber(String phoneNo) {
        //validate phone numbers of format "1234567890"
        if (phoneNo.matches("\\d{10}")) return true;

        //validating phone number with -, . or spaces
        else if(phoneNo.matches("\\d{3}[-\\.\\s]\\d{3}[-\\.\\s]\\d{4}")) return true;

        //Invalid phone number where 999.999.9999 or 999-999-9999 or 999 999 9999
        else if(phoneNo.matches"(\\D?[0-9]{3}\\D?)[\\s][0-9]{3}-[0-9]{4}")) return false;

        //return false if nothing matches the input
        else return false;

    }

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

Вы можете сделать это с помощью одного регулярного выражения:

(?!(\d)\1{2}\D?\1{3}\D?\1{4})\d{3}([-. ]?)\d{3}\2\d{4}

В качестве кода Java ваш метод будет:

private static boolean validatePhoneNumber(String phoneNo) {
    // Check if phone number is valid format (optional -, . or space)
    // e.g. "1234567890", "123-456-7890", "123.456.7890", or "123 456 7890"
    // and is that all digits are not the same, e.g. "999-999-9999"
    return phoneNo.matches("(?!(\\d)\\1{2}\\D?\\1{3}\\D?\\1{4})\\d{3}([-. ]?)\\d{3}\\2\\d{4}");
}

Объяснение

Регулярное выражение состоит из 2 частей:

(?!xxx)yyy

yyy часть:

\d{3}([-. ]?)\d{3}\2\d{4}

Что означает:

\d{3}     Match 3 digits
([-. ]?)  Match a dash, dot, space, or nothing, and capture it (capture group #2)
\d{3}     Match 3 digits
\2        Match the previously captured separator
\d{4}     Match 4 digits

Это означает, что оно будет соответствовать, например, 123-456-7890 или 123.456.7890, но не 123.456-7890

(?!xxx)part является отрицательным прогнозом нулевой ширины, то есть он совпадает, если выражение xxx не совпадает, а часть xxx имеет вид:

(\d)\1{2}\D?\1{3}\D?\1{4}

Что означает:

(\d)   Match a digit and capture it (capture group #1)
\1{2}  Match 2 more of the captured digit
\D?    Optionally match a non-digit
\1{3}  Match 3 more of the captured digit
\D?    Optionally match a non-digit
\1{4}  Match 4 more of the captured digit

Поскольку вторая часть уже проверила разделители, отрицательный прогноз - просто использование более расслабленного \D для пропуска любого символа разделителя.

0 голосов
/ 05 декабря 2018

Вы можете использовать следующие регулярные выражения для сопоставления телефонных номеров, чьи цифры не совпадают:

  • для формата 0123456789:

    (?!(.)\\1{9})\\d{10}
    

    Вы можете попробоватьэто здесь .

  • для формата 012-345-6789:

    (?!(.)\\1{2}[-.\\s]\\1{3}[-.\\s]\\1{4})\\d{3}[-.\\s]\\d{3}[-.\\s]\\d{4}
    

    Вы можете попробовать здесь .

Он полагается на негативную перспективу, чтобы убедиться, что числа, которые мы собираемся сопоставить, не являются одной и той же цифрой.

0 голосов
/ 05 декабря 2018

Лучше использовать Stream API вместо сложного регулярного выражения

if(phoneNo.chars().filter(c -> c != '.' && c != '-' && c != ' ').distinct().count() > 1)

или

phoneNo.chars().filter(c -> ".- ".indexOf(c) > -1).distinct().count() > 1

или

phoneNo.chars().filter(Character::isDigit).distinct().count() > 1
0 голосов
/ 05 декабря 2018

Несмотря на то, что вы можете написать регулярное выражение для этого, он кажется более читаемым с помощью итерации.

boolean uniqueDigits = phoneNo.chars()
        .filter(Character::isDigit)
        .distinct()
        .count() >= 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...