【问题标题】:How do I check if a Java String contains at least one capital letter, lowercase letter, and number?如何检查 Java 字符串是否至少包含一个大写字母、小写字母和数字?
【发布时间】:2017-03-13 04:38:35
【问题描述】:

我知道我可以通过一系列遍历字符串的 for 循环来做到这一点,但这将是糟糕的编程。嗯,我的教授不喜欢我这样做。我想使用正则表达式来做到这一点。

【问题讨论】:

  • 那么是什么阻止你使用正则表达式来做到这一点?
  • 我不知道。
  • 您不知道如何编写正则表达式或如何使用正则表达式检查String 是否匹配?通过您最喜欢的搜索引擎进行搜索,应该很容易找到两者的教程。
  • @MichaelDrum:见stackoverflow.com/questions/5892115/…。就时间复杂度而言,Regex 的行为与简单的线性搜索相同。在最坏的情况下,正则表达式可能表现不佳。关键是,您的案例太简单了,无法查看正则表达式。反正对我来说似乎没有什么特别的优势。
  • 为什么是“糟糕的编程”?它可能至少会同样有效,甚至可能更高。

标签: java string


【解决方案1】:

试试正则表达式

^(?=.*[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”语句的形式写出来?
  • 这些不是法语和西班牙语的有效字母吗? aAàÀâÂæÆbBcCçÇdDeEéÉèÈêÊëËfFgGhHiIîÎïÏjJkKlLmMnNñÑoOôÔœŒpPqQrRsStTuUùÙûÛüÜvVwWxXyYÿŸzZáÁíÍóÓúÚ 法语和/或西班牙语或...的模式是什么? stackoverflow.com/a/4052294/731548
【解决方案2】:

你可以使用java的Character类。所以对于小写,Character.isLowerCase(ch) Character.isUpperCase(ch)。对于这个你必须遍历字符串。我知道那位与您无关,但是您可以将"\\d+" 用于字符串中的数字。

【讨论】:

    【解决方案3】:

    对于简单的字符串检查,对字符串进行一次扫描就足够了。由于正则表达式不会提供任何显着的好处,这里有一个简单的 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
    【解决方案4】:

    你可以使用:

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

    【讨论】:

    • 老兄,如果文本参数字符已经小写,这是错误的答案,它也会返回true,例如isTextContainUpperCase("a text");将返回true,尽管它根本不包含大写字符跨度>
    • 将 if 语句编辑为 !text.equals(text.toLowerCase()) 它可能会按照您的要求进行(我在答案中编辑了代码)
    【解决方案5】:

    @goshDeveloper 的答案示例。

    首先用你想要的正则表达式创建一个模式变量。

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

    其次你可以这样使用它:

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

    【讨论】:

    【解决方案6】:

    使用 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);
    }
    

    【讨论】:

    • 我喜欢您解决方案的可读性。性能方面,我不喜欢每个新条件都需要对值进行额外的迭代。当然,在中小型字符串上不是大问题,但需要考虑。
    【解决方案7】:

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

    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)");
    

    希望对您有所帮助。 谢谢你。 问候, 塔努梅萨哈

    【讨论】:

    • 对民族性格有用吗?例如。波兰语ĘÓĄŚŁŻŹĆŃ ?它们都是大写的,但不属于 ASCII [A-Z]
    • 小写字母可以使用".*[a-z].*"
    【解决方案8】:
    final String toCheck = "hasUppercasechar";
    final boolean checkOk = !toCheck.chars().filter(Character::isUpperCase).findAny().isEmpty()
    

    查看java.lang.Character 并结合您需要的检查

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      相关资源
      最近更新 更多