【问题标题】:Java Password CheckerJava 密码检查器
【发布时间】:2014-10-15 23:17:59
【问题描述】:

我的问题是创建一个包含 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();
      }

   }
} 

【问题讨论】:

  • 您可能想了解正则表达式。

标签: java regex


【解决方案1】:

使用正则表达式

您应该使用正则表达式来检查这些暴击。

一、代码:

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 个字符。

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

在前面的例子中,它给你一个非常直观的output

没有正则表达式

所以,如果你不能使用 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。我从String 创建一个character array,并循环遍历它的元素。如果当前字符是数字、大写或小写,我设置一个标志来表示其中一个语句为真。一开始,所有的陈述都是假的,最后我会返回它们的总和的结果。

在前两行中,我检查参数是否不为空,以及它的长度是否正确。

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

如果没有希望,解决这个问题,here's 完整代码。
相信我,它会更有用,如果你尝试自己解决这个问题,首先!

【讨论】:

  • 谢谢你们,但是我今天在课堂上问我的编程教授关于正则表达式的问题,她说我们不会学习它们并且我不能在作业中使用它们?相反,我编辑了我的原始代码并修复了它。如果您第一次输入数字和字母,它会接受密码,但如果您必须第二次输入,即使密码正确,它也会要求您一次又一次地输入。我确定我的循环有问题,但我没有看到。
  • @VatoPotato,这是另一个解决方案,没有任何正则表达式。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2014-11-08
    • 2017-09-24
    • 1970-01-01
    • 2013-02-06
    • 2011-02-03
    相关资源
    最近更新 更多