【问题标题】:Regex validate password with conditional statement Java正则表达式使用条件语句 Java 验证密码
【发布时间】:2016-04-18 11:11:58
【问题描述】:

我是正则表达式的新手。

基本上我需要在 Java 中验证密码以满足以下要求:

  1. 密码必须至少包含六个字符。
  2. 密码最多可以包含 20 个字符

为了使密码有效,应满足以下 4 条验证规则中的任意 3 条:

  1. 从 A 到 Z 的英文字母的大写字母;
  2. 小写字母 a 到 z;
  3. 十进制数字(0 到 9);
  4. 非字母数字字符(例如!、$、#、%)

例如:

  1. Q145aqa - 可以,因为包含大写、小写和数字
  2. 145AS$ - 可以,因为包含大写、数字和非字母数字字符
  3. 145234$ - 不行,因为只包含数字和非字母数字字符,并且缺少其他验证规则

基本上这是我目前的正则表达式:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d]{6,20}$

我不知道如何将非字母数字字符的条件添加到表达式中,以及如何让正则表达式检查是否满足上述 4 个验证规则中的任何三个以使密码有效?

【问题讨论】:

  • 为此使用 1 个正则表达式不是一个好主意。使用单独的模式并计算其中有多少是匹配的。
  • 前两个可以很容易地用String#length 评估,其他的我会用@WiktorStribiżew 的建议。 (那时单个正则表达式会变得非常简单,只需检查它是否包含大写字母等)
  • @WiktorStribiżew 为什么?
  • @WiktorStribiżew 我同意你的看法。我刚刚准备了同样的例子
  • @ButaniVijay:如果你愿意,你可以投票赞成评论,我相信不需要额外的行动:)

标签: java regex


【解决方案1】:

根据@kevin Esche 的评论,您可以简单地使用字符串的.length() 方法测试前两个验证。

为了使密码有效,您可以使用以下代码中的 4 条验证规则中的任何 3 条。

public static void main(String[] args) {
        // TODO Auto-generated method stub
        int count=0;
        String password="a34A43";

       boolean hasUppercase = !password.equals(password.toLowerCase());
       boolean hasLowercase = !password.equals(password.toUpperCase());

        if(hasUppercase)
            count++;
        if(hasLowercase)
            count++;

        Pattern p1 = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
        Matcher m = p1.matcher(password);
        if(m.find())
            count++;
        Pattern p2 = Pattern.compile("\\d+", Pattern.CASE_INSENSITIVE);
        Matcher m2 = p2.matcher(password);
        if(m2.find())
            count++;

        if(count>=3)
            System.out.println("Valid Password");
        else
            System.out.println("Invalid Password");
    }   

【讨论】:

    【解决方案2】:

    这是一个有效的例子:

    private final static String PASSWORD_PATTERN = "^[a-zA-Z0-9\\!\\$\\#\\%]{6,20}$";
    

    【讨论】:

    • 这不会验证 4 个验证规则中的 3 个。重新阅读问题。
    猜你喜欢
    • 2023-02-03
    • 2021-10-17
    相关资源
    最近更新 更多