在Java中检查字符串中的字母大小写(上/下)

Jon*_*n A 47 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 !@#$%^&*\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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sin*_*int 152

要确定String是否包含大写字母和小写字母,您可以使用以下内容:

boolean hasUppercase = !password.equals(password.toLowerCase());
boolean hasLowercase = !password.equals(password.toUpperCase());
Run Code Online (Sandbox Code Playgroud)

这允许您检查:

if(!hasUppercase)System.out.println("Must have an uppercase Character");
if(!hasLowercase)System.out.println("Must have a lowercase Character");
Run Code Online (Sandbox Code Playgroud)

本质上,这通过检查String是否等于其完全小写或大写等效来实现.如果不是这样,那么必须至少有一个大写或小写的字符.

至于您的其他条件,可以通过类似的方式满足这些条件:

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
Run Code Online (Sandbox Code Playgroud)

使用上面的适当错误消息.

  • 希望你坚持下去.祝你好运:D (3认同)

Flo*_*ris 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
            }
Run Code Online (Sandbox Code Playgroud)

有一个明显的逻辑缺陷:如果第一个字符不是小写,则输入它,然后测试第二个字符是否不是小写.那时你会抛出一个错误.

相反,你应该做这样的事情(不是完整的代码,只是一个例子):

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
}
Run Code Online (Sandbox Code Playgroud)

当然,除了错误的逻辑之外,您提供的代码片段没有代码来测试您的"帮助"选项打印出来的其他条件.正如在其他一个答案中指出的那样,您可以考虑使用正则表达式来帮助您加快查找每个事物的过程.例如,

hasNumber  : use regex pattern "\d+" for "find at least one digit"
hasSpecial : use regex pattern "[!@#$%^&*]+" for "find at least one of these characters"
Run Code Online (Sandbox Code Playgroud)

在代码中:

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

有可能以巧妙的方式组合这些东西 - 但是特别是当你是一个新手正则表达式用户时,最好是有点"缓慢而乏味",并获得第一次工作的代码(加上你将能够弄清楚你从现在起六个月后做了什么).


Boh*_*ian 6

虽然这段代码可能超出了新手的理解,但可以使用具有正面和负面预测的正则表达式在一行中完成:

boolean ok = 
    password.matches("^(?=.*[A-Z])(?=.*[!@#$%^&*])(?=.*\\d)(?!.*(AND|NOT)).*[a-z].*");
Run Code Online (Sandbox Code Playgroud)