0

我对密码规则有要求。以下是规则。

密码必须遵循以下准则:

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

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

    • 小写字母 (az)
    • 大写字母 (AZ)
    • 数字 (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;

谢谢,拉姆基

4

2 回答 2

11

这是,如果你想要一个优雅的正则表达式,尽可能接近

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&'])[^ ]{8,}$

基本思想是使用一种称为“积极前瞻”的技术:

(?=.*PutHereWhatYouWantToAllow)

使用正则表达式很难解决您的额外要求(四分之三),因为您基本上无法使它们计数。您可以写出上述正则表达式的必要排列(告诉我它是否没有意义),但这会使正则表达式很长。您可以做的是写出代码中的排列,以便正则表达式保持可维护性,因为您没有逐字重复这些模式。

如果我告诉我你的语言(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]. [!@#$%^&'])|(?=.[阿兹]。[!@#$%^&']。[\d])|(?=. [\d]. [az]. [!@#$%^&'])|(?=. [\d]. [!@#$%^&'] . [az])|(?=. [!@#$%^&']. [az]. [\d])|(?=. [!@#$%^&']. [\d] . [az])|(?=. [AZ]. [\d]. [!@#$%^&'])|(?=. [AZ]. [!@#$%^&']. [\d])|(?=. [\d]. [AZ]. [!@#$%^&'])|(?=. [\d]. [!@#$%^&'] . [AZ])|(?=. [!@#$%^&']. [AZ]. [\d])|(?=. [!@#$%^&']. [\d] . [AZ]))[^]{8,}$

更新 2

这是采用java的方法

从我读到的评论中,您正在测试如下

  • 小写 "^[az]*$";
  • 大写 "^[AZ]*$";
  • 数字="^[0-9]*$";

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

这些是 4 个单独的正则表达式,其中至少 3 个应该报告匹配

[a-z]
[A-Z]
\d
[!@#$%^&']

这是密码不应该包含空格的测试

^[^ ]*$

至少 8 个字符的测试

.{8,}

所以我拆分需求而不是合并它们。这应该使代码更具可读性,特别是如果以正则表达式开头。

于 2012-05-23T23:43:33.343 回答
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 种模式中添加了一些特殊字符……您必须根据需要对其进行修改。您可能需要使用反斜杠转义某些字符。您可能还想添加其他约束,例如检查是否没有空格。我会把它留给你。

于 2012-05-24T00:43:46.267 回答