如何检查Java字符串至少包含一个大写字母、小写字母和数字?

36

我知道可以通过一系列迭代字符串的for循环来实现,但那是糟糕的编程方式。我的教授不希望我这样做。我想使用正则表达式来实现。


那么,有什么阻止你使用正则表达式来完成这个任务的呢? - t0mppa
3
我不知道怎么做。 - Michael Drum
6
你不知道如何编写正则表达式,也不知道如何使用它来检查一个字符串是否匹配吗?通过你喜欢的搜索引擎搜索教程应该很容易找到。 - t0mppa
1
@MichaelDrum: 请查看https://dev59.com/SW025IYBdhLWcg3wpHh-。就时间复杂度而言,正则表达式的行为与简单的线性搜索相同。在最坏情况下,正则表达式的行为可能会很差。关键是,你的情况过于简单,不需要使用正则表达式。对我来说,似乎也没有任何特定的优势。 - CyprUS
为什么这是“糟糕的编程”?它可能至少与其他方法一样有效,甚至更加高效。 - Louis Wasserman
手册的相关部分开始。 - dave
9个回答

40

对于简单的字符串检查,只需一次遍历字符串即可。由于正则表达式不会提供任何显著的好处,因此这里使用简单的for循环来实现相同的功能:

private static boolean checkString(String str) {
    char ch;
    boolean capitalFlag = false;
    boolean lowerCaseFlag = false;
    boolean numberFlag = false;
    for(int i=0;i < str.length();i++) {
        ch = str.charAt(i);
        if( Character.isDigit(ch)) {
            numberFlag = true;
        }
        else if (Character.isUpperCase(ch)) {
            capitalFlag = true;
        } else if (Character.isLowerCase(ch)) {
            lowerCaseFlag = true;
        }
        if(numberFlag && capitalFlag && lowerCaseFlag)
            return true;
    }
    return false;
}

测试运行:

System.out.println(checkString("aBCd1")); // output is true
System.out.println(checkString("abcd")); //output is false

我认为这应该有助于解决OP的特定问题。


如果我这样做:System.out.println(checkString("A")); 并且我这样做 System.out.println(checkString("a")); 我会收到相同的输出 -> false - ericmp

21

@goshDeveloper的回答示例。

首先,使用您要的正则表达式创建一个Pattern变量。

public final Pattern textPattern = Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).+$");

其次,您可以像这样使用它:

public boolean isTextValid(String textToCheck) {
return textPattern.matcher(textToCheck).matches();
}

1
这个模式可能适用于法语、西班牙语或其他语言吗?https://dev59.com/6G855IYBdhLWcg3w-JbS#4052294 - cquezel

17

使用Java 9:

public boolean isValid(String value) {
    return containsLowerCase(value) && 
           containsUpperCase(value) && 
           containsNumber(value);
}

private boolean containsLowerCase(String value) {
    return contains(value, i -> Character.isLetter(i) && Character.isLowerCase(i));
}

private boolean containsUpperCase(String value) {
    return contains(value, i -> Character.isLetter(i) && Character.isUpperCase(i));
}

private boolean containsNumber(String value) {
    return contains(value, Character::isDigit);
}

private boolean contains(String value, IntPredicate predicate) {
    return value.chars().anyMatch(predicate);
}

5
我喜欢你的解决方案易读性。就性能而言,我不喜欢每个新条件都需要对值进行一次额外的迭代。当然在小/中字符串上这不是一个大问题,但需要考虑。 - Roland van der Linden
解决方案需要最低API 24。 - Codelicious

15

尝试正则表达式

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$

descriptions are as follow
(?=.*[a-z])  -- check lower case letter
(?=.*[A-Z]) -- check upper case letter
(?=.*\d) -- check one digit exists

谢谢。这看起来非常有前途。然而,我没有正则表达式的经验。假设我想知道字符串_text_是否至少包含一个小写字母、一个大写字母和一个数字。我该如何用“if”语句来编写呢? - Michael Drum
2
请按照此教程进行操作:https://www.tutorialspoint.com/java/java_regular_expressions.htm - Ghost Developer
1
这些字母在法语和西班牙语中都是有效的吗?aAàÀâÂæÆbBcCçÇdDeEéÉèÈêÊëËfFgGhHiIîÎïÏjJkKlLmMnNñÑoOôÔœŒpPqQrRsStTuUùÙûÛüÜvVwWxXyYÿŸzZáÁíÍóÓúÚ。这个模式适用于法语和/或西班牙语,还是其他什么?https://dev59.com/6G855IYBdhLWcg3w-JbS#4052294 - cquezel

11

你可以使用:

public static boolean isTextContainUpperCase(String text) {
       if (StringUtils.isEmpty(text)) {
              return false;
       }
       return !text.equals(text.toLowerCase());
}

兄弟,如果文本参数字符已经小写,那么这个答案是错误的,例如 isTextContainUpperCase("a text"); 将返回 true,尽管它根本不包含大写字符。 - HendraWD
3
将if语句编辑为!text.equals(text.toLowerCase()),它可能会做你要求的事情(我编辑了答案中的代码)。 - David Karlsson

6

如果你想检查你的字符串是否包含大写字母,你可以使用以下模式:

String s="abcDe_shdgwU";    //you can have any String here

if(s.matches(".*[A-Z].*"))
   System.out.println("The String contains Uppercase letter(s)");
else
  System.out.println("does not contain Uppercase letter(s)");

希望能对您有所帮助。 谢谢。 祝好, Tanumay Saha

它可以处理国家字符吗?例如波兰的 ĘÓĄŚŁŻŹĆŃ?它们都是大写字母,但不属于 ASCII [A-Z] - zolv
对于小写字母,您可以使用“.*[a-z].*”。 - LukeSolar

0
你可以使用Java的Character类。所以对于小写字母,Character.isLowerCase(ch),对于大写字母,Character.isUpperCase(ch)。为此,你必须迭代字符串。我知道这一点与你无关,但是你可以在字符串中使用"\\d+"来表示数字。

0
See the code below;
public class passwordValidationOne {
    public static void main(String[] args) {
        String pass = "Password1";
        System.out.println(valPassword(pass));
    }
    public static boolean valPassword(String password){
        if (password.length()>7){
            if (checkPass(password)){
                return true;
            }
            else {
                return false;
            }
        }
        else{
            System.out.println("Too Small");
            return false;
        }
    }
    public static boolean checkPass(String password){
        boolean hasNum =false; //check if password has a number
        boolean hasCap =false; //check if password has uppercase character
        boolean hasLow =false; //check if password has lowercase characters
        char c; // used to check every single character in the password

        //loop for every single character in a string
        for (int i =0; i<password.length(); i++ ){
            //assign c to the character we are looking for
            c = password.charAt(i);
            if (Character.isDigit(c)){
                hasNum = true;
            } else if (Character.isUpperCase(c)) {
                hasCap = true;
            } else if (Character.isLowerCase(c)) {
                hasLow = true;
            }
            // check if all the three boolean variables are true
            if (hasNum && hasCap && hasLow){
                return true;
            }
        }
       return  false;

    }
}

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0
final String toCheck = "hasUppercasechar";
final boolean checkOk = !toCheck.chars().filter(Character::isUpperCase).findAny().isEmpty()

看一下java.lang.Character,并组合您所需的检查


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接