2013-04-21 210 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; 
     } 

    } 
} 
相關問題