2013-04-21 47 views
30

Sự cố mà tôi gặp phải là tôi không thể lấy Chương trình Xác minh Mật khẩu của mình để kiểm tra chuỗi để đảm bảo rằng, 1 ký tự nằm trong chữ hoa và một là trong trường hợp thấp hơn, nó sẽ kiểm tra toàn bộ chuỗi cho một trong những khác và in thông báo lỗi dựa trên đó tuyên bố nó đang kiểm tra.Kiểm tra trường hợp chữ cái (Trên/Dưới) trong một chuỗi trong Java

Tôi đã xem xét trang web này và internet để tìm câu trả lời và tôi không thể tìm thấy câu trả lời. Đây là bài tập về nhà.

Dưới đây là mã hiện tại của tôi.

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

Tôi tưởng tượng bạn muốn áp dụng * tất cả * của những hạn chế này vào mật khẩu, và else if không phải là xây dựng cho điều đó. –

Trả lời

111

Để xác định xem một String chứa một chữ hoa và một trường hợp char thấp hơn, bạn có thể sử dụng như sau:

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

này cho phép bạn kiểm tra:

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

Về cơ bản, điều này hoạt động bằng cách kiểm tra xem Chuỗi có bằng với chữ thường hoàn toàn hoặc chữ hoa tương đương hay không. Nếu điều này không đúng, thì phải có ít nhất một ký tự viết hoa hoặc viết thường.

Đối với các điều kiện khác của bạn, chúng có thể được thỏa mãn theo cách tương tự:

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 

Với thông báo lỗi thích hợp như trên.

+1

Đó là một mẹo hay! – Floris

+0

Chỉnh sửa nhỏ: 'password.length()> = 8' kể từ độ dài = 8 là đủ. Điều này đang trở thành câu trả lời yêu thích của tôi. – Floris

+0

Đã sửa lỗi :) Cảm ơn bạn đã chọn. – Sinkingpoint

7

Một vòng lặp như thế này:

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 
      } 

Có một lỗ hổng logic rõ ràng: Bạn nhập nó nếu ký tự đầu tiên không phải là chữ thường, sau đó kiểm tra nếu nhân vật thứ hai là trường hợp không thấp. Tại thời điểm đó bạn ném một lỗi.

Thay vào đó, bạn nên làm một cái gì đó như thế này (mã không đầy đủ, chỉ là ví dụ):

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 
} 

Tất nhiên đoạn mã mà bạn cung cấp, bên cạnh những thiếu logic, không có mã để kiểm tra sự các điều kiện khác mà tùy chọn "trợ giúp" của bạn được in ra. Như đã được chỉ ra trong một trong những câu trả lời khác, bạn có thể xem xét sử dụng các biểu thức chính quy để giúp bạn tăng tốc quá trình tìm kiếm từng thứ này. Ví dụ,

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" 

Trong mã:

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

Có thể kết hợp những điều này theo những cách thông minh - nhưng đặc biệt là khi bạn là người dùng regex mới làm quen, nó là tốt hơn để có một chút "chậm và tẻ nhạt", và nhận được mã hoạt động lần đầu tiên (cộng với bạn sẽ có thể tìm ra những gì bạn đã làm sáu tháng kể từ bây giờ).

+0

Cảm ơn bạn rất nhiều vì đã trả lời nhanh chóng. Điều này có ý nghĩa tổng thể. Đi xuống con đường sai lầm, đã nhìn chằm chằm vào nó trong một giờ suy nghĩ về cách tôi có thể thay đổi nó. –

+0

Mặc dù điều này là dài dài-er sau đó nó cần phải được, và chỉ kiểm tra 8 ký tự đầu tiên của mật khẩu. – Sinkingpoint

+0

@Quirliom - yêu cầu là mật khẩu dài tám ký tự, theo văn bản "trợ giúp". Không phải 9, không phải 10. Nó nói '" \ nMust chứa 8 ký tự. "Có lẽ tôi đã lấy nó theo nghĩa đen. Tôi sẽ cập nhật cho phù hợp. – Floris

6

Mặc dù mã này có khả năng vượt quá sự hiểu biết của một người mới, nó có thể được thực hiện trong một dòng sử dụng một regex với tích cực và tiêu cực nhìn aheads:

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

"Không chứa NOT hoặc AND, có một trong các ký tự đặc biệt này'! @ # $%^& * ', Chứa một số. Tất cả các điều kiện đó đã được kiểm tra chưa? Tôi không coi mình là người mới, nhưng tôi không ' – Floris

+0

@ Floris Câu hỏi yêu cầu xác nhận rằng chuỗi chứa ít nhất 1 chữ cái trên và ít nhất 1 chữ cái chăm sóc thấp hơn. Đó chính xác là mã của tôi. Tôi nhận thấy mã này chỉ yêu cầu một số và một số đặc biệt – Bohemian

+0

1 cho sự khiếp sợ và mật độ Tôi phải mất một thời gian để thuyết phục bản thân rằng những người nhìn có thể xích lại một cách an toàn như thế - tôi nghĩ chìa khóa là '. * 'trong mỗi người. Vẫn đang học ... – Floris

0

Đó là những gì tôi nhận:

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); 

đọc về regex Pattern ở đây: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

2

tôi đã sắp xếp hợp lý các câu trả lời của @Quirliom trên vào chức năng mà có thể được sử dụng:

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; 
     } 

    } 
} 
Các vấn đề liên quan