2015-10-01 85 views
0

這一個會很快,我必須做一個程序,檢查密碼是否有效。它必須至少8個字符,有一個較低的字符,一個大寫的字符,並且至少有一個特殊字符是有效的。否則,密碼將無效。一切似乎都沒有問題,但即使是這樣,它似乎也沒有檢查出有效。我覺得它與角色位置或什麼有關,但我不能確定它到底是什麼。 編輯:更新,包括正則表達式 的代碼如下:密碼檢查錯誤

/* Class:  CS1301 
* Section:  9:30 
* Term:   Fall 2015 
* Name:   Matthew Woolridge 
* Instructor: Mr. Robert Thorsen 
* Assignment: Assignment 6 
* Program:  3 
* ProgramName: PasswordTest 
* Purpose:  The program prompts the user to input a password and says if it is valid or invalid 
* Operation:  The information is statically instantiated in the code and 
*    the data is output to the screen. 
* Input(s):  The input the password 
* Output(s):  The output will be valid or invalid 
* Methodology: The program will use loops to determine if valid or invalid 
* 
*/ 

import java.lang.*; 
import java.util.*; 
public class PasswordTest 
{ 

    public static void main (String[] args) 
    { 

    /****************************************************************************** 
    *       Declarations Section        * 
    ******************************************************************************/ 
    /****************************CONSTANTS********************************/ 

     String pass; 
     int i; 
     boolean valid=false; 
     Scanner scan = new Scanner(System.in); //Initializes the scanner 

     //"^(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[*/&%^*$#@!~+_]).+$" //RegexChecker 

    /****************************************************************************** 
    *        Inputs Section         * 
    ******************************************************************************/ 
     System.out.print("Please input a password: "); 
     pass = scan.nextLine(); 

    /****************************variables********************************/ 
    //*********************Using while loop so in processing*********************// 

    /****************************************************************************** 
    *        Processing Section       * 
    ******************************************************************************/ 

     for (i = 0; i<pass.length(); i++) 
     { 
     if(pass.matches("^(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[*/&%^*$#@!~+_]).+$")){ 
      valid=true; 
     } 
     } 
     if (valid==true){ 
     System.out.print("Entered Password: " + pass); 
     System.out.print("\nThe pass is:  Valid!"); 
     } 
     else{ 
     System.out.print("Entered Password: " + pass); 
     System.out.print("\nThe pass is:  Invalid!"); 
     } 

    /****************************************************************************** 
    *        Outputs Section        * 
    ******************************************************************************/ 
    //*********************The outputs are in the processing*****************// 
    } //Ends string 
} //Ends program 

回答

2

使用正則表達式將解決您的問題

你的參數是一個有效的密碼

  • 至少一個小寫
  • 至少一個大寫
  • 至少一個特殊符號(/&%^ $#@!〜+ _)
  • 在長度至少爲8個字符

此正則表達式。將就好

^(?=.{8,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[*/&%^*$#@!~+_]).+$ 

public class RegexDemo { 

public static void main(String [] args) 
{ 
    String text1 ="ghhthyuj"; 
    String text2 ="G$hthyu5"; 
    System.out.println(text1.matches("^(?=.{8,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[*/&%^*$#@!~+_]).+$")); 
    System.out.println(text2.matches("^(?=.{8,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[*/&%^*$#@!~+_]).+$")); 
} 

}

輸出:文本1 =假 文本2 =真

簡短說明:

^     // the start of the string 
(?=.*[a-z])  // use positive look ahead to see if at least one lower case letter exists 
(?=.*[A-Z])  // use positive look ahead to see if at least one upper case letter exists 
(?=.*[0-9])  // use positive look ahead to see if at least one digit exists 
(?=.{8,})   // use positive look ahead to see if length of string is at least 8 charachters 
(?=.*[*/&%^*$#@!~+_]) // use positive look ahead to see if at least one special character exists 
.+     // gobble up the entire string 
$     // the end of the string 
+0

正則表達式有時會起作用,但它似乎只是希望使用特定的密碼而不是任何順序,只要滿足這些要求即可。例如,G $ hthyuj的作品,但如果我鍵入fa#4F它返回無效。請幫忙@ Nishant123。 – snipem1438

+0

上面提到的密碼有效的參數不包含數字。所以我做了一個適合你的要求的正則表達式。我編輯了我的答案並更改了正則表達式。現在它應該需要在一個數字是有效的 – Nishant123

+0

哦,我不能相信我沒有注意到我自己或我會包括它。非常感謝你! @ Nichant123它就像一個魅力! – snipem1438

2

您的處理部分中的循環,使得只有一個迭代,突破過去的if-else語句的else塊發生之前。嘗試將其移出循環,檢查整個密碼,而不僅僅是密碼的第一個字母。

還有一個,你不需要每次循環檢查密碼的長度,你只能做一次。

for (i = 0; i<pass.length(); i++) 
{ 
    verify = pass.charAt(i); 
    if (pass.contains(special)) 
    { 
     specialCheck=true; 
    } 
    if (Character.isUpperCase(verify)){ 
     upCheck = true; 
    } 
    if (Character.isLowerCase(verify)){ 
     lowCheck=true; 
    } 
    if (Character.isDigit(verify)){ 
     digitCheck = true; 
    } 

    if(upCheck==true && lowCheck==true && digitCheck==true){ 
     valid = true; 
     break; 
    } 
} 
if(valid == true && pass.length()>=8) { 
    System.out.print("Entered Password: " + pass); 
    System.out.print("\nThe pass is:  Valid!"); 
} else { 
    System.out.print("Entered Password: " + pass); 
    System.out.print("\nThe pass is:  Invalid!"); 
}