Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex使用条件语句Java验证密码_Java_Regex - Fatal编程技术网

Regex使用条件语句Java验证密码

Regex使用条件语句Java验证密码,java,regex,Java,Regex,我对regex不熟悉 基本上,我需要用Java验证密码,以满足以下要求: 密码必须至少包含六个字符 密码最多可包含20个字符 要使密码有效,应满足以下4条验证规则中的任意3条: 从A到Z的英文字母的大写字母 小写字母a至z 小数位数(0到9) 非字母数字字符(例如!、$、#、%) 例如: Q145aqa-因为包含大写、小写和数字,所以可以 145AS$-由于包含大写、数字和非字母数字字符,因此可以 145234$-不正常,因为它只包含数字和非字母数字字符,并且缺少另一个验证规则 基本上这是我现在

我对regex不熟悉

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

  • 密码必须至少包含六个字符
  • 密码最多可包含20个字符
  • 要使密码有效,应满足以下4条验证规则中的任意3条:

  • 从A到Z的英文字母的大写字母
  • 小写字母a至z
  • 小数位数(0到9)
  • 非字母数字字符(例如!、$、#、%)
  • 例如:

  • Q145aqa
    -因为包含大写、小写和数字,所以可以
  • 145AS$
    -由于包含大写、数字和非字母数字字符,因此可以
  • 145234$
    -不正常,因为它只包含数字和非字母数字字符,并且缺少另一个验证规则
  • 基本上这是我现在的正则表达式:

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

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

    根据@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");
        }   
    

    根据@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");
        }   
    

    这是一个有效的例子:

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

    这是一个有效的例子:

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

    为此使用1个正则表达式不是一个好主意。使用单独的模式并计算匹配的模式数。前两个模式可以用
    String#length
    轻松计算,对于其他模式,我将使用@WiktorStribiżew建议。(如果单个正则表达式到那时会变得非常简单,只需检查它是否包含大写字母等即可)@WiktorStribiżew为什么?@WiktorStribiżew我同意你的看法。我刚刚准备了一个例子same@ButaniVijay:如果你这样做了,你可以对评论进行投票,我认为没有必要采取额外的行动:)为此使用1个正则表达式不是一个好主意。使用单独的模式并计算匹配的模式数。前两个模式可以用
    String#length
    轻松计算,对于其他模式,我将使用@WiktorStribiżew建议。(如果单个正则表达式到那时会变得非常简单,只需检查它是否包含大写字母等即可)@WiktorStribiżew为什么?@WiktorStribiżew我同意你的看法。我刚刚准备了一个例子same@ButaniVijay:如果您这样做了,您可以向上投票该评论,我相信不需要执行其他操作:)这不会验证4条验证规则中的3条。重新阅读问题。这不会验证4条验证规则中的3条。重读问题。