我需要密码规则。以下是规则。
密码必须遵循以下准则:
当用户指定的密码不符合上述规则时,请返回消息说明:
密码长度必须至少为8个字符,并包含以下4个选项中的3个:
请帮助我获得正则表达式来处理上述情况。
我感谢你的帮助。以下是我的要求的解决方案
if(password.matches("^(?=.*[0-9]).{1,}$")){
validCount++;
}
if(password.matches("^(?=.*[a-z]).{1,}$")){
validCount++;
}
if(password.matches("^(?=.*[A-Z]).{1,}$")){
validCount++;
}
if(password.matches("^(?=.*[@#$%^&+=]).{1,}$")){
validCount++;
}
return validCount >= 3 ? true : false;
谢谢, 拉姆金
答案 0 :(得分:10)
这就是说,如果你想要一个优雅的正则表达式,尽可能接近
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&'])[^ ]{8,}$
基本思想是使用一种名为“积极前瞻”的技术:
(?=.*PutHereWhatYouWantToAllow)
你的额外要求中有3个是不容易用正则表达式解决的,因为你不能基本上计算它们。 你可以写出上面正则表达式的必要排列(告诉我它是否没有意义),但这会产生一个很长的正则表达式。 您可以做的是在代码中写出排列,以便正则表达式保持可维护状态,因为您不是按字面重复模式。
如果你告诉我你的语言(C#?),我会有机会,因为这是一个很好的挑战。
更新1
这是正则表达式,它将满足至少3个要求(也允许4个),仅用于挑战它。不要在生产中使用它,而是使用注释中提到的单个正则表达式的语言循环。
^((= [AZ] [AZ] [\ d])|?。?。(= [AZ] [\ d] [AZ])|(= [AZ] [AZ] [\ d])|?。?。(= [AZ 。] [\ d] [AZ])|(= [\ d] [AZ] [AZ])|?。?(= 。 [\ d] [AZ] [AZ])|(= [AZ] [AZ] [?。! @#$%^&安培; '])|(= [AZ] [@#$%^&安培;?!'。?] [AZ])|(= [AZ] [AZ] 。。[@#$%^&安培;!']?!)|(= [AZ] [@ #$%^&安培; '] [AZ])|(= [@#$%^&安培;?!'。] [AZ] [AZ ])|(= [@#$%^&安培;!。?。'] [AZ] [AZ])|(= [AZ]。 [\ d] [@#$%^&安培;!'])|(= [AZ] [@#$%^&安培;。! ] [\ d])|(= [\ d] [AZ] [@#$%^&安培;?'])|(!? = [\ d] [@#$%^&安培;!']。?! [AZ])|(= [@#$%^&安培; '] [AZ] [\ d])|(= [@#$%^&安培;?!'。。] [\ d] < /em>[az])|(?=.[AZ].[\d].[!@#$%^&'])|(?=. [AZ] [@#$%^&安培;!']。?。 [\ d])|(= [\ d] [AZ] [@#$%^&安培;! '])|(= [\ d] ?。[@#$%^&安培;!']。 [ AZ])|(= [@#$%^&安培;?'] [AZ] [\ d])|(= [!。?。! @#$%^&放;']。 [\ d]。 [A-Z]))[^] {8,} $
更新2
这是采用java
的方法从我看到的评论中你正在测试如下
我不认为你在这里走在正确的轨道上。如果所有字符都是小写的,则小写仅报告成功,而不只是一个。其余的一样。
这是4个单独的正则表达式,其中至少3个应该报告匹配
[a-z]
[A-Z]
\d
[!@#$%^&']
以下是密码不应包含空格的测试
^[^ ]*$
至少8个字符的测试
.{8,}
所以我分开了要求而不是将它们结合起来。这应该使代码更易读,特别是如果以正则表达式开头。
答案 1 :(得分:3)
我将如何做到这一点:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ValidatePassword
{
public static void main (String[] args)
{
String pw = "abaslkA3FLKJ";
// create an array with 4 regex patterns
Pattern [] patternArray = {
Pattern.compile("[a-z]"),
Pattern.compile("[A-Z]"),
Pattern.compile("[0-9]"),
Pattern.compile("[&%$#]")
};
int matchCount = 0;
// iterate over the patterns looking for matches
for (Pattern thisPattern : patternArray) {
Matcher theMatcher = thisPattern.matcher(pw);
if (theMatcher.find()) {
matchCount ++;
}
}
if (matchCount >= 3) {
System.out.println("Success");
}
else {
System.out.println("Failure: only " + matchCount + " matches");
}
}
}
我只在第4种模式中添加了一些特殊字符 ...您必须根据需要对其进行修改。您可能需要使用反斜杠转义某些字符。您可能还想添加其他约束,例如检查无空格。我会把它留给你。