我需要知道正则表达式是如何用于以下情况的:
( ... ).{8,}
(?=.*[a-z|A-Z])
(?=.*\d)
(?=.*[~'!@#$%?\\\/&*\]|\[=()}"{+_:;,.><'-])
我在其他正则表达式中得到以下内容:
((?=.*\d)(?=.*[a-z|A-Z])(?=.*[~'!@#$%?\\\/&*\]|\[=()}"{+_:;,.><'-])).{8,}
但它失败了:
qwer!234
任何提示?
答案 0 :(得分:4)
在Java正则表达式中,由于字符串转义规则,您需要加倍反斜杠:
Pattern regex = Pattern.compile("^(?=.*\\d)(?=.*[a-zA-Z])(?!\\w*$).{8,}");
应该有用。
<强>解释强>
^ # Start of string
(?=.*\d) # Assert presence of at least one digit
(?=.*[a-zA-Z]) # Assert presence of at least one ASCII letter
(?!\w*$) # Assert that the entire string doesn't contain only alnums
.{8,} # Match 8 or more characters
答案 1 :(得分:1)
对于所有这些特殊字符,你很可能没有正确地逃避一切。
你说Java对吗?这会打印true
:
String regex = "((?=.*\\d)(?=.*[a-zA-Z])(?=.*[~'!@#$%?\\\\/&*\\]|\\[=()}\"{+_:;,.><'-])).{8,}";
System.out.println("qwer!234".matches(regex));
但这有点简单:
String regex = "(?=.*?\\d)(?=.*?[a-zA-Z])(?=.*?[^\\w]).{8,}";
答案 2 :(得分:1)
为什么要将这一切都放在一个正则表达式中?只需为每个检查创建单独的函数,您的代码将更容易理解和维护。
if len(password) > 8 &&
has_alpha(password) &&
has_digit(password) &&
...
您的业务逻辑立即变得无法承受。另外,当你想添加一些其他条件时,你不必修改棘手的正则表达式。
答案 3 :(得分:0)
Pattern letter = Pattern.compile("[a-zA-z]");
Pattern digit = Pattern.compile("[0-9]");
Pattern special = Pattern.compile ("[!@#$%&*()_+=|<>?{}\\[\\]~-]");
Pattern eight = Pattern.compile (".{8}");
...
public final boolean ok(String password) {
Matcher hasLetter = letter.matcher(password);
Matcher hasDigit = digit.matcher(password);
Matcher hasSpecial = special.matcher(password);
Matcher hasEight = eight.matcher(password);
return hasLetter.find() && hasDigit.find() && hasSpecial.find()
&& hasEight.matches();
}
它会起作用。