我正在尝试将正则表达式写在哪里,如果所有相同的数字都作为电话号码提供,则它会失败。当我提供以下输入时,它将通过验证。
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;
}
答案 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-7890
或123.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