Java 创建密码验证器的规则之一是:密钥必须包含'#';或A'_';,但不是两者都有

Java 创建密码验证器的规则之一是:密钥必须包含'#';或A'_';,但不是两者都有,java,string,validation,if-statement,passwords,Java,String,Validation,If Statement,Passwords,我正在制作一个密码/密钥验证程序,其中包含一组验证密码/密钥必须满足的规则 这些规则如下: -密钥长度至少为7个字符,最多为20个字符,并且 -密钥不得以特殊字符“#”或“”开头,以及 -键的任何位置都不能有空格字符,并且 -密钥必须至少有一个大写字符和一个小写字符,以及 -密钥不能包含用户名,并且 -密钥必须包含“#”或“”,但不能同时包含两个 if (!key.matches("^[^#_]+[#_]{1,1}[^#_]*")) { UI.println("Inval

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

这些规则如下: -密钥长度至少为7个字符,最多为20个字符,并且 -密钥不得以特殊字符“#”或“”开头,以及 -键的任何位置都不能有空格字符,并且 -密钥必须至少有一个大写字符和一个小写字符,以及 -密钥不能包含用户名,并且 -密钥必须包含“#”或“”,但不能同时包含两个

    if (!key.matches("^[^#_]+[#_]{1,1}[^#_]*")) {
        UI.println("Invalid: Key must contain either a '#' or a '_', but not both");
    }
除了最后一条规则“密钥必须包含“#”或“#”,但不能同时包含这两个字符外,我已成功地使所有代码正常工作

我目前拥有的代码如下。我是学习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.startsWith ("#") || (key.startsWith ("_"))){
    UI.println("Invalid: Key cannot start with '#' or '_'");
   } 
   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(specialChars)){
    UI.println("Invalid: Key must contain either a '#' or a '_', but not both");
   } 
   else {
    UI.println("Valid");
   }


}
*要求用户输入关键字和名称,然后检查该关键字是否有效。
*/
公共作废文件完成(){
字符串key=UI.askString(“key:”);
String name=UI.askString(“您的名字:”);
此.validateKeyCompletion(键、名称);
}
/**完成
*报告密钥有效或报告密钥失败的所有规则。
*/
公共void validateKeyCompletion(字符串键、字符串名称){
/*#你的代码在这里*/
int characterNumber=key.length();
布尔字母大写;
布尔值为小写;
hassuppercase=!key.equals(key.toLowerCase());
hasLowercase=!key.equals(key.toUpperCase());
字符串specialChars=“(.[#!].”;
如果(字符数<7 | |字符数>20){
UI.println(“无效:密钥长度不得小于7或大于20”);
}
else if(key.startsWith(“#”)||(key.startsWith(“|”)){
println(“无效:密钥不能以“#”或“#”开头);
} 
else if(key.contains(“”){
UI.println(“无效:密钥不能包含“””);
}
如果(!hassuppercase)
{
println(“无效:键必须包含大写字符”);
}
如果(!hasLowercase),则为else
{
println(“无效:密钥必须包含小写字符”);
}
else if(key.matches(name)){
UI.println(“无效:密钥不能包含用户名”);
}
如果(!key.matches(specialChars))为else{
println(“无效:键必须包含“#”或“#”,但不能同时包含这两个”);
} 
否则{
UI.println(“有效”);
}
}

尝试下面的方法,并在JAVA中使用indexOf方法:

 * 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.startsWith ("#") || (key.startsWith ("_"))){
    UI.println("Invalid: Key cannot start with '#' or '_'");
   } 
   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.indexOf('#') > -1 && key.indexOf('_') > -1){
    UI.println("Invalid: Key must contain either a '#' or a '_', but not both");
   } 
   else {
    UI.println("Valid");
   }


}
*要求用户输入关键字和名称,然后检查该关键字是否有效。
*/
公共作废文件完成(){
字符串key=UI.askString(“key:”);
String name=UI.askString(“您的名字:”);
此.validateKeyCompletion(键、名称);
}
/**完成
*报告密钥有效或报告密钥失败的所有规则。
*/
公共void validateKeyCompletion(字符串键、字符串名称){
/*#你的代码在这里*/
int characterNumber=key.length();
布尔字母大写;
布尔值为小写;
hassuppercase=!key.equals(key.toLowerCase());
hasLowercase=!key.equals(key.toUpperCase());
字符串specialChars=“(.[#!].”;
如果(字符数<7 | |字符数>20){
UI.println(“无效:密钥长度不得小于7或大于20”);
}
else if(key.startsWith(“#”)||(key.startsWith(“|”)){
println(“无效:密钥不能以“#”或“#”开头);
} 
else if(key.contains(“”){
UI.println(“无效:密钥不能包含“””);
}
如果(!hassuppercase)
{
println(“无效:键必须包含大写字符”);
}
如果(!hasLowercase),则为else
{
println(“无效:密钥必须包含小写字符”);
}
else if(key.matches(name)){
UI.println(“无效:密钥不能包含用户名”);
}
else if(key.indexOf('#')>-1&&key.indexOf('#')>-1){
println(“无效:键必须包含“#”或“#”,但不能同时包含这两个”);
} 
否则{
UI.println(“有效”);
}
}

下面的正则表达式检查键是否以
'.
'.
开头,并包含其中一个字符,但不能同时包含这两个字符

    if (!key.matches("^[^#_]+[#_]{1,1}[^#_]*")) {
        UI.println("Invalid: Key must contain either a '#' or a '_', but not both");
    }

您的代码似乎不正确,因为如果
同时包含
,您的检查将返回
true
。大于-1条件检查字符是否存在,如果两者都存在,则将打印错误消息。对不起,您是对的。实际上,当键不包含not
、not
时,您的检查将忽略该情况,在这种情况下,它还返回
false