2013-04-21 212 views
30

我遇到的问题是我无法让我的密码验证程序检查字符串以确保1个字符是大写,一个是小写字母,它会检查整个字符串中是否有其他字符串,并根据它正在检查的语句来打印错误消息。在Java中检查字符串中的字母大写(上/下)

我已经看过这个网站和互联网的答案,我无法找到一个。这是作业。

下面是我目前的代码。

import java.util.Scanner; 

public class password 
{ 
    public static void main(String[] args) 
    { 
     Scanner stdIn = new Scanner(System.in); 
     String password; 
     String cont = "y"; 
     char ch; 
     boolean upper = false; 
     boolean lower = false; 

     System.out.println("Setting up your password is easy. To view requirements enter Help."); 
     System.out.print("Enter password or help: "); 
     password = stdIn.next(); 
     ch = password.charAt(0); 

     while (cont.equalsIgnoreCase("y")) 
     { 
      while (password.isEmpty()) 
      { 
       System.out.print("Enter password or help: "); 
       password = stdIn.next();  
      } 

      if (password.equalsIgnoreCase("help")) 
      { 
       System.out.println("Password must meet these requirements." + 
        "\nMust contain 8 characters.\nMust contain 1 lower case letter." + 
        "\nMust contain 1 upper case letter.\nMust contain 1 numeric digit." + 
        "\nMust contain 1 special character [email protected]#$%^&*\nDoes not contain the word AND or NOT."); 

       password = ""; 
      } 
      else if (password.length() < 8) 
      { 
       System.out.println("Invalid password - Must contain 8 charaters."); 
       password = ""; 
      } 
      else if (!(Character.isLowerCase(ch))) 
      { 
       for (int i=1; i<password.length(); i++) 
       { 
        ch = password.charAt(i); 

        if (!Character.isLowerCase(ch)) 
        { 
         System.out.println("Invalid password - Must have a Lower Case character."); 
         password = ""; 
        } 
       } 
      } 
      else if (!(Character.isUpperCase(ch))) 
      { 
       for (int i=0; i<password.length(); i++) 
       {  
        ch = password.charAt(i); 

        if (!Character.isUpperCase(ch)) 
        { 
         System.out.println("Invalid password - Must have an Upper Case character."); 
         password = ""; 
        } 
       } 
      } 
      else 
      { 
       System.out.println("Your password is " + password); 

       System.out.print("Would you like to change your password? Y/N: "); 
       cont = stdIn.next(); 
       password = ""; 
      } 

      while (!cont.equalsIgnoreCase("y") && !cont.equalsIgnoreCase("n")) 
      { 
       System.out.print("Invalid Answer. Please enter Y or N: "); 
       cont = stdIn.next(); 
      } 
     } 
    } 
} 
+0

我想象的要应用* *所有这些限制的密码,否则如果不是的结构。 – 2013-04-21 04:19:21

回答

111

要确定一个字符串包含大写和小写字符,你可以使用以下命令:

boolean hasUppercase = !password.equals(password.toLowerCase()); 
boolean hasLowercase = !password.equals(password.toUpperCase()); 

这允许你检查:

if(!hasUppercase)System.out.println("Must have an uppercase Character"); 
if(!hasLowercase)System.out.println("Must have a lowercase Character"); 

从本质上讲,这是通过检查字符串是否等于它的全部小写或大写等价来实现的。如果不是这样,那么必须至少有一个大写或小写字符。

至于你的其他条件下,这些可以是用类似的方式满足:

boolean isAtLeast8 = password.length() >= 8;//Checks for at least 8 characters 
boolean hasSpecial = !password.matches("[A-Za-z0-9 ]*");//Checks at least one char is not alpha numeric 
boolean noConditions = !(password.contains("AND") || password.contains("NOT"));//Check that it doesn't contain AND or NOT 

与合适的错误消息如上。

+1

这是一个不错的诀窍! – Floris 2013-04-21 04:48:09

+0

小编辑:'password.length()> = 8'因为length = 8应该足够了。这正成为我最喜欢的答案。 – Floris 2013-04-21 04:57:23

+0

固定:)感谢您的光临。 – Sinkingpoint 2013-04-21 04:58:43

7

像这样的一个循环:

else if (!(Character.isLowerCase(ch))) 
      { 
       for (int i=1; i<password.length(); i++) 
       { 
        ch = password.charAt(i); 

        if (!Character.isLowerCase(ch)) 
         { 
         System.out.println("Invalid password - Must have a Lower Case character."); 
         password = ""; 
         } 
        // end if 
       } //end for 
      } 

有一个明显的逻辑缺陷:你进入它,如果第一个字符不是小写字母,然后测试,如果第二个字符不是小写。那时你会发出一个错误。

相反,你应该做这样的事情(不完整的代码,只是一个例子):

boolean hasLower = false, hasUpper = false, hasNumber = false, hasSpecial = false; // etc - all the rules 
for (ii = 0; ii < password.length(); ii++) { 
    ch = password.charAt(ii); 
    // check each rule in turn, with code like this: 
    if Character.isLowerCase(ch) hasLower = true; 
    if Character.isUpperCase(ch) hasUpper = true; 
    // ... etc for all the tests you want to do 
} 

if(hasLower && hasUpper && ...) { 
    // password is good 
} 
else { 
    // password is bad 
} 

当然的代码片段你提供,除了错误的逻辑,没有代码来测试的其他条件,您的“帮助”选项打印出来。正如在其他答案中指出的那样,您可以考虑使用正则表达式来帮助您加速查找每一件事情的过程。例如,

hasNumber : use regex pattern "\d+" for "find at least one digit" 
hasSpecial : use regex pattern "[[email protected]#$%^&*]+" for "find at least one of these characters" 

在代码:

hasNumber = password.matches(".*\\d.*"); // "a digit with anything before or after" 
hasSpecial = password.matches(".*[[email protected]#$%^&*].*"); 
hasNoNOT = !password.matches(".*NOT.*"); 
hasNoAND = !password.matches(".*AND.*"); 

有可能这些东西巧妙的方式组合 - 尤其当你是一个新手,正则表达式的用户,它是要好得多一点点“缓慢而乏味”,并获得第一次运行的代码(再加上你将能够计算出你在六个月后做了什么)。

+0

非常感谢您的快速回复。这是完全意义上的。走下了错误的道路,一直在盯着它思考如何改变它。 – 2013-04-21 04:32:30

+0

虽然这是很长 - 呃然后它需要,并且只检查密码的前8个字符。 – Sinkingpoint 2013-04-21 04:38:27

+0

@Quirliom - 根据“帮助”文本,要求密码长度为8个字符。不是9,不是10.它说'“\ n必须包含8个字符。”'也许我太直白地说了。我会相应更新。 – Floris 2013-04-21 04:43:08

6

虽然这段代码很可能超出了新手的理解,也可以在同一行使用正则表达式阳性和阴性查找aheads完成:

boolean ok = 
    password.matches("^(?=.*[A-Z])(?=.*[[email protected]#$%^&*])(?=.*\\d)(?!.*(AND|NOT)).*[a-z].*"); 
+0

“不包含NOT或AND,具有这些特殊字符之一'!@#$%^&*',包含一个数字。是否测试了所有这些条件?我不认为自己是新手,但是我不'你可以看到它 – Floris 2013-04-21 04:47:19

+0

@弗洛里斯问题要求断言该字符串至少包含1个上限和至少1个下级字母,这正是我的代码所做的事情,我注意到现在代码(仅)需要一个数字和一个特殊为了满足这个需求,我编辑了一个答案 – Bohemian 2013-04-21 06:08:08

+0

+1,我花了一段时间才说服自己,这些lookahead可以像这样被安全地链接在一起 - 我认为关键在于它们中的每一个。仍然在学习...... – Floris 2013-04-21 06:28:56

0

这就是我的了:

Scanner scanner = new Scanner(System.in); 
    System.out.println("Please enter a nickname!"); 
    while (!scanner.hasNext("[a-zA-Z]{3,8}+")) { 
     System.out.println("Nickname should contain only Alphabetic letters! At least 3 and max 8 letters"); 
     scanner.next(); 
    } 
    String nickname = scanner.next(); 
    System.out.println("Thank you! Got " + nickname); 

阅读正则表达式在这里: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

2

我已精简@Quirliom的答案为以上功能,可用于:

private static boolean hasLength(CharSequence data) { 
    if (String.valueOf(data).length() >= 8) return true; 
    else return false; 
} 

private static boolean hasSymbol(CharSequence data) { 
    String password = String.valueOf(data); 
    boolean hasSpecial = !password.matches("[A-Za-z0-9 ]*"); 
    return hasSpecial; 
} 

private static boolean hasUpperCase(CharSequence data) { 
    String password = String.valueOf(data); 
    boolean hasUppercase = !password.equals(password.toLowerCase()); 
    return hasUppercase; 
} 

private static boolean hasLowerCase(CharSequence data) { 
    String password = String.valueOf(data); 
    boolean hasLowercase = !password.equals(password.toUpperCase()); 
    return hasLowercase; 
} 
0
package passwordValidator; 

import java.util.Scanner; 

public class Main { 
    /** 
    * @author felipe mello. 
    */ 

    private static Scanner scanner = new Scanner(System.in); 

    /* 
    * Create a password validator(from an input string) via TDD 
    * The validator should return true if 
    * The Password is at least 8 characters long 
    * The Password contains uppercase Letters(atLeastOne) 
    * The Password contains digits(at least one) 
    * The Password contains symbols(at least one) 
    */ 


    public static void main(String[] args) { 
     System.out.println("Please enter a password"); 
     String password = scanner.nextLine(); 

     checkPassword(password); 
    } 
    /** 
    * 
    * @param checkPassword the method check password is validating the input from the the user and check if it matches the password requirements 
    * @return 
    */ 
    public static boolean checkPassword(String password){ 
     boolean upperCase = !password.equals(password.toLowerCase()); //check if the input has a lower case letter 
     boolean lowerCase = !password.equals(password.toUpperCase()); //check if the input has a CAPITAL case letter 
     boolean isAtLeast8 = password.length()>=8;     //check if the input is greater than 8 characters 
     boolean hasSpecial = !password.matches("[A-Za-z0-9]*");  // check if the input has a special characters 
     boolean hasNumber = !password.matches(".*\\d+.*");   //check if the input contains a digit 
     if(!isAtLeast8){ 
      System.out.println("Your Password is not big enough\n please enter a password with minimun of 8 characters"); 
      return true; 
     }else if(!upperCase){ 
      System.out.println("Password must contain at least one UPPERCASE letter"); 
      return true; 
     }else if(!lowerCase){ 
      System.out.println("Password must contain at least one lower case letter"); 
      return true; 
     }else if(!hasSpecial){ 
      System.out.println("Password must contain a special character"); 
      return true; 
     }else if(hasNumber){ 
      System.out.println("Password must contain at least one number"); 
      return true; 
     }else{ 
      System.out.println("Your password: "+password+", sucessfully match the requirements"); 
      return true; 
     } 

    } 
} 
相关问题