Java密码模式

时间:2016-09-25 00:53:56

标签: java regex passwords username password-checker

密码检查程序应该用户输入用户名和密码,并输出密码是有效还是无效。

我一直试图使用正则表达式,但我遇到了问题。该模式适用于我的所有规则,但其中一个是用户名规则。 另外,有没有办法改变" true"的输出?或"假"定制的东西?

到目前为止我的代码:

import java.util.regex.*;
import java.util.Scanner;

public class validPassword {
    private static Scanner scnr;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        // Variable Management
        String un, pw, req; // Variable Variable

        System.out.println("Please enter a username: ");
        // ^Need to implement so if it matches the password it's invalid^
          un = input.nextLine(); // Gathers user's username input
        System.out.println("Please enter a password: ");
          pw = input.nextLine(); // Gathers user's password input

        req = "(?=.*[0-9])(?=.*[a-zA-Z]).{8,}";
        System.out.println(pw.matches(req)); // Can I customize the output?
    }

}

我感谢任何帮助! :)

2 个答案:

答案 0 :(得分:1)

您应该能够初步检查它是否具有该子序列。 我会先检查一下然后检查你的密码规则。 所以像这样(使用正则表达式):

// get username and password
if(pw.matches(".*"+Pattern.quote(un)+".*")){
    System.out.println("Password can't have username in it...");
}
// make sure password follows rules...

最好在字符串(docs)上使用contains方法。

if (pw.contains(un)) {...}

至于自定义matches的输出,你不能。你需要有条件地分支并做一些不同的事情。

答案 1 :(得分:0)

对于用户名检查,您可以将正则表达式更改为

"(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])((?<!" + Pattern.quote(un) + ").(?!" + Pattern.quote(un) + ")){8,}"

表示至少8个未跟随或前面有用户名的任意字符。正如您使用正向前瞻来满足包含三个字符类的要求一样,这具有负面的后观和负向前瞻。

关于自定义输出,只需使用三元表达式:

System.out.println(pw.matches(req) ? "yehaw" : "buuuuuh")