密码模式匹配失败

时间:2012-09-09 06:26:54

标签: java regex

我的密码条件是,最少8个字符,最少一个特殊字符,最少一个数字

为此我写了一个简单的类来验证,但最终失败了。

非常感谢任何帮助。

public class PasswordVerifier {
    private static final String SPECIAL_CHARACTERS = "(`~!@#$%^&*()_+=-][;'/.,\\<>?|:\"}{)";

    public static void main(String... args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        try {
            String password = in.readLine();
            if(!password.matches("^.*(?=.{8,})(?=.*[0-9])(?=.*[SPECIAL_CHARACTERS]).*$")){
                System.out.println("Password does not satisfy compliant");
            } else {
                System.out.println("Yes.. gets through");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

3 个答案:

答案 0 :(得分:3)

这可能适合您的要求:

private static final String SPECIAL_CHARACTERS = "(`~!@#$%^&*()_+=-\\]\\[;'/.,\\<>?|:\"}{)";

public static void main(String[] args) {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    try {
        String password = in.readLine();
        if(!password.matches("((?=.*\\d)(?=.*["+SPECIAL_CHARACTERS+"]).{8,})")){
            System.out.println("Password does not satisfy compliant");
        } else {
            System.out.println("Yes.. gets through");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

正则表达式指定:

  • 输入必须包含0-9
  • 中的一位数字
  • 必须在您定义的SPECIAL_CHARACTERS列表中包含一个特殊符号
  • 长度应至少为8个字符

答案 1 :(得分:2)

我不打算尝试编写正则表达式。是。这包括你所有的条件,没有什么比这更难写,更难理解,也可能不是非常有效。只需明确编码您的要求:

boolean isAcceptablePassword(String pwd) {
    boolean numeric = false, special = false;
    if (pwd.length() >= 8) {
        for (int i = pwd.length() - 1; !numeric && !special && i >= 0; --i) {
            char c = pwd.charAt(i);
            numeric = numeric || Character.isDigit();
            special = special || SPECIAL_CHARACTERS.indexOf(c) >= 0;
        }
    }
    return numeric && special;
}

答案 2 :(得分:0)

如果是字符类,则中间不能有]-,因为它们对字符类语法有意义。如果你想要它们,那么它们必须是班级中的前两个元素,-之前的]