Java密码检查器

时间:2014-10-15 23:17:59

标签: java regex

我的问题是创建一个包含6到10个字符且至少包含一个字母和一个数字的密码,然后让用户重新输入密码并确认它们是否匹配。

我唯一的问题是检查密码是否有字母或数字。我浏览过并在网站上发现了同样的问题,但我对他们在代码中引用的一些方法和其他内容感到困惑,因为我似乎以不同方式构建了我的方法。我想过使用indexOf()方法来查看它是否返回-1值,但我不确定从哪里开始。

我是java的新手,我确信有一种更有效的方法来构建它,我会喜欢任何提示。

import java.util.Scanner;
public class Password
{
   public static void main(String[] args)
   {
      //Input from user
      String password;
      Scanner input = new Scanner(System.in);
      System.out.print("Please create your password: ");
      password = input.nextLine();

      //Checking password length
      while( (password.length() < 6) || (password.length() > 10) )
      {
         System.out.print("This password must be between 6 and 10 characters. Try again: ");
         password = input.nextLine();
      }

      //Checking to see if passwords contain digit/letter
      /*Need to add code here */

      //Confirming if passwords match   
      String password2;   
      System.out.print("\nPlease type your password again to confirm: ");
      password2 = input.nextLine();

      while( !password2.equals(password) )
      {
         System.out.print("Those passwords do not match. Try again: ");
         password2 = input.nextLine();
      }

   }
} 

2 个答案:

答案 0 :(得分:2)

使用正则表达式

您应该使用正则表达式来检查theese crits。

首先,代码:

pwd.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{6,10}$")

以下是一个完整的例子:

public class HelloWorld{    
     public static void main(String []args){
        String password = "aA2";
        String regexp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{6,10}$";
        System.out.println(password.matches(regexp));
        password = "12345678";
        System.out.println(password.matches(regexp));
        password = "aA345678";
        System.out.println(password.matches(regexp));
     }
}

给出以下输出:

false
false
true

正则表达式匹配任何字符串,至少包含大写字母,一个小写字母和一个数字,以及6-10个字符长。

你可以找到更多关于theese here的例子。以及有关Wikipedia上的正则表达式的一些信息。有关正则表达式和Java的非常好的教程可以在Vogella找到。 (这是一个非常好的网站,我认为有非常好的教程!)并且,一个方便的工具来显示正则表达式匹配的内容:http://www.regexper.com/

如果是上一个例子,它会给你一个非常直观的output

没有Regexs

所以,如果你不能使用Regulax表达式,我会创建一个函数,如果密码正常则返回true,在任何其他情况下都返回false。以下是此功能的一个小例子:

public static boolean passwordOk(String password){
    if (password == null) return false;
    if (password.length() < 6 || password.length() > 10) return false;
    boolean containsUpperCase = false;
    boolean containsLowerCase = false;
    boolean containsDigit = false;
    for(char ch: password.toCharArray()){
        if(Character.isUpperCase(ch)) containsUpperCase = true;
        if(Character.isLowerCase(ch)) containsLowerCase = true;
        if(Character.isDigit(ch)) containsDigit = true;
    }
    return containsUpperCase && containsLowerCase && containsDigit;
}

此解决方案中的主要思想是for-each loop。我从character array创建了一个String,然后遍历它的元素。如果当前字符是数字,或大写或小写,我设置一个标志,以签名,其中一个语句为真。一开始,所有的陈述都是假的,最后我会返回他们总和的结果。

在我检查的前两行中,如果参数不为null,并且它是否具有正确的长度。

我希望,在此之后你将能够解决你的功课!您甚至可以使用null指针调用此函数,因此我将创建一个while循环,以便在此函数不返回true时运行。

如果没有希望,解决这个问题,here's完整的代码 相信我,如果你想先自己解决这个问题,那将会更有用!

答案 1 :(得分:0)

你可以使用这样的东西......

if( password.matches(".*[a-zA-Z]+.*")){
     System.out.println( "Has characters ");
} else {
     System.out.println("Ok");   
}

这是为了检查密码是否包含字母

同样,您可以使用正则表达式".*[0-9]+.*"来检查密码是否包含数字。