密码规则的正则表达式

时间:2012-05-23 23:37:56

标签: regex

我需要密码规则。以下是规则。

密码必须遵循以下准则:

  • 至少八个字符
  • 包含以下4个选项中的3个:小写字母,大写字母,数字或特殊字符
  • 当用户指定的密码不符合上述规则时,请返回消息说明:

    密码长度必须至少为8个字符,并包含以下4个选项中的3个:

    • 小写字母(a-z)
    • 大写字母(A-Z)
    • 号码(0-9)
    • 特殊字符(!@#$%^&')

请帮助我获得正则表达式来处理上述情况。

我感谢你的帮助。以下是我的要求的解决方案

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;

谢谢, 拉姆金

2 个答案:

答案 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

的方法

从我看到的评论中你正在测试如下

  • 小写“^ [a-z] * $”;
  • 大写“^ [A-Z] * $”;
  • 位数= “^ [0-9] * $”;

我不认为你在这里走在正确的轨道上。如果所有字符都是小写的,则小写仅报告成功,而不只是一个。其余的一样。

这是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种模式中添加了一些特殊字符 ...您必须根据需要对其进行修改。您可能需要使用反斜杠转义某些字符。您可能还想添加其他约束,例如检查无空格。我会把它留给你。