电话号码验证应失败的所有相同的号码

时间:2018-12-05 15:50:05

标签: java regex

我正在尝试将正则表达式写在哪里,如果所有相同的数字都作为电话号码提供,则它会失败。当我提供以下输入时,它将通过验证。 999.999.9999999-999-9999999 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 :(得分:3)

尽管您可以编写一个正则表达式来执行此操作,但在迭代时感觉更易读。

func isValidPassword() -> Bool{
    guard let password = passwordText.text else { return false }

    let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[d$@$!%*?&#])[A-Za-z\\dd$@$!%*?&#]{8,}"
    return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: password)
}

答案 1 :(得分:3)

您可以使用单个正则表达式来实现:

(?!(\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}");
}

说明

正则表达式分为两部分:

(?!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-7890123.456.7890,但不是123.456-7890

(?!xxx)部分是零宽度的负向超前行,即,如果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来跳过任何分隔符。

答案 2 :(得分:2)

您可以使用以下正则表达式匹配数字不同的电话号码:

  • 对于0123456789格式:

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

    您可以here试试。

  • 对于012-345-6789格式:

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

    您可以here试试。

它依靠否定前瞻来检查我们要匹配的数字是否不是相同的数字。

答案 3 :(得分:1)

最好使用Stream API而不是复杂的正则表达式

data-toggle="collapse button"

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

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