在Java中检查字符串中的字母大写(上/下)
我遇到的问题是我无法让我的密码验证程序检查字符串以确保1个字符是大写,一个是小写字母,它会检查整个字符串中是否有其他字符串,并根据它正在检查的语句来打印错误消息。在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 [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();
}
}
}
}
要确定一个字符串包含大写和小写字符,你可以使用以下命令:
boolean hasUppercase = !password.equals(password.toLowerCase());
boolean hasLowercase = !password.equals(password.toUpperCase());
这允许你检查:
if(!hasUppercase)System.out.println("Must have an uppercase Character");
if(!hasLowercase)System.out.println("Must have a lowercase Character");
从本质上讲,这是通过检查字符串是否等于它的全部小写或大写等价来实现的。如果不是这样,那么必须至少有一个大写或小写字符。
至于你的其他条件下,这些可以是用类似的方式满足:
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
与合适的错误消息如上。
这是一个不错的诀窍! – Floris 2013-04-21 04:48:09
小编辑:'password.length()> = 8'因为length = 8应该足够了。这正成为我最喜欢的答案。 – Floris 2013-04-21 04:57:23
固定:)感谢您的光临。 – Sinkingpoint 2013-04-21 04:58:43
像这样的一个循环:
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
}
有一个明显的逻辑缺陷:你进入它,如果第一个字符不是小写字母,然后测试,如果第二个字符不是小写。那时你会发出一个错误。
相反,你应该做这样的事情(不完整的代码,只是一个例子):
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
}
当然的代码片段你提供,除了错误的逻辑,没有代码来测试的其他条件,您的“帮助”选项打印出来。正如在其他答案中指出的那样,您可以考虑使用正则表达式来帮助您加速查找每一件事情的过程。例如,
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"
在代码:
hasNumber = password.matches(".*\\d.*"); // "a digit with anything before or after"
hasSpecial = password.matches(".*[[email protected]#$%^&*].*");
hasNoNOT = !password.matches(".*NOT.*");
hasNoAND = !password.matches(".*AND.*");
有可能这些东西巧妙的方式组合 - 尤其当你是一个新手,正则表达式的用户,它是要好得多一点点“缓慢而乏味”,并获得第一次运行的代码(再加上你将能够计算出你在六个月后做了什么)。
非常感谢您的快速回复。这是完全意义上的。走下了错误的道路,一直在盯着它思考如何改变它。 – 2013-04-21 04:32:30
虽然这是很长 - 呃然后它需要,并且只检查密码的前8个字符。 – Sinkingpoint 2013-04-21 04:38:27
@Quirliom - 根据“帮助”文本,要求密码长度为8个字符。不是9,不是10.它说'“\ n必须包含8个字符。”'也许我太直白地说了。我会相应更新。 – Floris 2013-04-21 04:43:08
虽然这段代码很可能超出了新手的理解,也可以在同一行使用正则表达式阳性和阴性查找aheads完成:
boolean ok =
password.matches("^(?=.*[A-Z])(?=.*[[email protected]#$%^&*])(?=.*\\d)(?!.*(AND|NOT)).*[a-z].*");
“不包含NOT或AND,具有这些特殊字符之一'!@#$%^&*',包含一个数字。是否测试了所有这些条件?我不认为自己是新手,但是我不'你可以看到它 – Floris 2013-04-21 04:47:19
@弗洛里斯问题要求断言该字符串至少包含1个上限和至少1个下级字母,这正是我的代码所做的事情,我注意到现在代码(仅)需要一个数字和一个特殊为了满足这个需求,我编辑了一个答案 – Bohemian 2013-04-21 06:08:08
+1,我花了一段时间才说服自己,这些lookahead可以像这样被安全地链接在一起 - 我认为关键在于它们中的每一个。仍然在学习...... – Floris 2013-04-21 06:28:56
这就是我的了:
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);
阅读正则表达式在这里: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
我已精简@Quirliom的答案为以上功能,可用于:
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;
}
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;
}
}
}
我想象的要应用* *所有这些限制的密码,否则如果不是的结构。 – 2013-04-21 04:19:21