【问题标题】:Making A Password Key Validator And One Of The Output Should Show: Reports ALL The Rules That The Key Failed制作密码密钥验证器,其中一个输出应显示:报告密钥失败的所有规则
【发布时间】:2020-04-24 05:57:53
【问题描述】:

我正在制作一个密码/密钥验证器,其中包含一组必须满足的规则才能验证密码/密钥。

这些规则如下: - 密钥长度至少为 7 个字符,且最多为 20 个字符,AND - 密钥不得以特殊字符“#”或“”开头,AND - 密钥不得任何地方都有空格字符 AND - 密钥必须至少有一个大写字符和至少一个小写字符 AND - 密钥不能包含用户名 AND - 密钥必须包含“#”或'',但不是两者兼而有之。

我已经设法让所有规则发挥作用。有两个输出根据规则检查密钥,并报告密钥有效或报告密钥失败的所有规则。

在输出中,我无法显示/报告密钥失败的所有规则。

我目前拥有的代码如下。我是java新手,请谅解。

 * Asks user for key word and the name and then checks if it is a valid key word.
 */
public void doCompletion(){
    String key = UI.askString("Key:   ");
    String name = UI.askString("Your name:   ");
    this.validateKeyCompletion(key, name);
}

/** COMPLETION
 * Report that the key is valid or report ALL the rules that the key failed.
 */
public void validateKeyCompletion(String key, String name){
    /*# YOUR CODE HERE */
   int characterNumber = key.length();
   boolean hasUppercase;
   boolean hasLowercase;
   hasUppercase = !key.equals(key.toLowerCase());
   hasLowercase = !key.equals(key.toUpperCase());
   String specialChars = "(.*[ #  _  ].*)";
   if (characterNumber < 7 || characterNumber > 20){
    UI.println("Invalid: Key length must not be less than 7 or greater than 20");
   }
   else if (key.contains(" ")){
    UI.println("Invalid: Key cannot contain ' '");
   }
   else if(!hasUppercase)
   {
    UI.println("Invalid: Key must contain an uppercase character");
   }
   else if(!hasLowercase)
   {
    UI.println("Invalid: Key must contain a lowercase character");
   }
   else if(key.matches(name)){
    UI.println("Invalid: Key cannot contain Username");
   }
   else  if(!key.matches("^[^#_]+[#_]{1,1}[^#_]*")) {
    UI.println("Invalid: Key must contain either a '#' or a '_', but not both");
   }
   else {
    UI.println("Valid");
   }


}

【问题讨论】:

  • 将所有else if语句改为单独的if语句;否则它会在第一场比赛中停止
  • @Gus 感谢您的回复。所以你是说我应该删除所有的'else'并把它保留为'if'?
  • 是的,这将确保所有检查都发生。但是,您需要跟踪是否有任何检查失败。最简单的方法是在所有检查之前添加isValid=true,然后在每个 if 子句中设置 isValid=false。最后,如果isValid仍然为真,则都通过了
  • '@Gus 再次感谢您的回复。我试过你说的,但没有成功。我在所有检查之前添加了 isValid=true(在以 'if' 开头的行上方,它说没有找到带有 'isValid' 的变量。非常感谢任何帮助!

标签: java string validation if-statement key


【解决方案1】:

你已经很接近了;您当前的解决方案将在第一个失败案例中停止。由于您想知道所有失败的情况,因此您需要将所有检查分开(而不是在 if/else if/else if 链中)。但是,您需要一些方法来记住是否有任何检查最终未能确定通过/失败。最简单的方法是使用布尔值(我们称之为isValid 并在开始时设置为true,然后在每个if 块(当检查失败时触发)中,将isValid 设置为false。然后,如果它失败不止一次,它只会被设置为 false 几次,但最后你知道至少有一个检查失败了。

public void validateKeyCompletion(String key, String name) {
    int characterNumber = key.length();
    boolean isValid = true;  // use this to see if any checks have failed at the end
    boolean hasUppercase;
    boolean hasLowercase;
    hasUppercase = !key.equals(key.toLowerCase());
    hasLowercase = !key.equals(key.toUpperCase());
    if (characterNumber < 7 || characterNumber > 20) {
        UI.println("Invalid: Key length must not be less than 7 or greater than 20");
        isValid = false;  // set to false for each check that fails
    }
    if (key.contains(" ")) {
        UI.println("Invalid: Key cannot contain ' '");
        isValid = false;
    }
    if (!hasUppercase) {
        UI.println("Invalid: Key must contain an uppercase character");
        isValid = false;
    }
    if (!hasLowercase) {
        UI.println("Invalid: Key must contain a lowercase character");
        isValid = false;
    }
    if (key.matches(name)) {
        UI.println("Invalid: Key cannot contain Username");
        isValid = false;
    }
    if (!key.matches("^[^#_]+[#_]{1,1}[^#_]*")) {
        UI.println("Invalid: Key must contain either a '#' or a '_', but not both");
        isValid = false;
    }

    // now if isValid is true, we know all the checks passed
    if(isValid) {  
        UI.println("Pass!");
    } else {
        UI.println("Fail!");
    }

}

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2013-02-16
    • 1970-01-01
    相关资源
    最近更新 更多