如何使用Java和正则表达式测试字符串是否包含任何大写字母?

时间:2017-11-30 07:41:13

标签: java regex

我想只使用正则表达式

Raida => true
raida => false
raiDa => true

我试过这个:

   String string = "Raida"
   boolean bool = string.contains("?=.*[A-Z]");

   System.out.println(bool); 

但它不起作用

5 个答案:

答案 0 :(得分:3)

一个简单的解决方案是:

boolean hasUpperCase = !string.equals(string.toLowerCase());

将String转换为小写,如果它等于原始字符串,则它不包含任何大写字母。

在您的示例Raida中,您将成为

Raidaraida这两个不相等所以意味着原始字符串包含大写字母

答案 1 :(得分:3)

接近你原来想法的东西。你基本上只是检查字符串中是否有一个包含大写字母的部分 - 在它之前和之后可以有任何其他字符。这里我包含了一个用于测试目的的小型主要方法。

public static void main(String[] args) {
    test("raid");
    test("raId");
    test("Raida");
    test("R");
    test("r");
    test(".");
    test("");
}

public static void test(String word) {
    //(?s) enables the DOTALL mode
    System.out.println(word + " -> " + word.matches("(?s).*[A-Z].*"));
}

我编辑了这个例子来处理换行符。我刚刚在Windows机器上测试过。现在使用DOTALL:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#DOTALL。在这种模式下,表达式。匹配任何字符,包括行终止符。

答案 2 :(得分:1)

正式表达式解决方案的答案已经发布,以及许多其他相当方便的选项。我还建议在这里使用Java 8 API。它可能不是性能方面的最佳选择,但它大大简化了代码。解决方案可以写在一行中:

string.chars().anyMatch(Character::isUpperCase);

此解决方案的好处是可读性。目的很明确。即使你想逆转它。

答案 3 :(得分:0)

您可以替换所有非UpperLetter并计算长度,如果它大于或等于1,则表示至少有一个大写字母:

String input = "raiDa";
boolean check = input.replaceAll("[^A-Z]", "").length() >= 1;

String::contain旁边不使用正则表达式阅读documentation

Ideone demo

答案 4 :(得分:0)

您的模式只需要被()包围。

Pattern pattern = Pattern.compile("(?=.*[A-Z])");
        Matcher matcher = pattern.matcher(string);
        while (matcher.find()) {
            bool = true;
        }

如果您想要替代regex,请尝试使用Character.isUpperCase()

boolean bool = false;
        for (int i = 0; i < string.length(); i++) {
            char c = string.charAt(i);
            if (Character.isUpperCase(c)) {
                bool = true;
                break;
            }
        }
        System.out.println(bool);