Существует ли существующий метод библиотеки, который проверяет, является ли строка в верхнем или нижнем регистре в Java? - PullRequest
28 голосов
/ 24 марта 2009

Я знаю, что в Java и в других средах, таких как Apache commons lang, существует множество upper() методов, которые преобразуют строку в верхний регистр.

Существуют ли общие библиотеки, которые предоставляют метод, такой как isUpper(String s) и isLower(String s), чтобы проверить, все ли символы в строке являются прописными или строчными?

EDIT:

Много хороших ответов о преобразовании в Upper и сравнении с этим. Думаю, мне следовало быть более конкретным и сказать, что я уже думал об этом, но я надеялся, что смогу использовать для этого существующий метод.

Хороший комментарий о возможном включении этого в apache.commons.lang.StringUtils. Кто-то даже представил патч (20090310). Надеюсь, мы скоро это увидим. https://issues.apache.org/jira/browse/LANG-471

EDIT:

Для чего мне был нужен этот метод, было использовать заглавные буквы отелей, которые иногда вводились заглавными буквами. Я только хотел сделать их заглавными, если они все были в нижнем или верхнем регистре. Я столкнулся с проблемами с буквами без букв, упомянутыми в некоторых постах, и в итоге сделал что-то вроде этого:

private static boolean isAllUpper(String s) {
    for(char c : s.toCharArray()) {
       if(Character.isLetter(c) && Character.isLowerCase(c)) {
           return false;
        }
    }
    return true;
}

Это обсуждение и разные решения (с разными проблемами) ясно показывают, что в commons.lang

нужен хороший твердый метод isAllUpper (String s).

До тех пор я думаю, что myString.toUpperCase().equals(myString) - лучший путь.

Ответы [ 8 ]

22 голосов
/ 19 января 2013

Теперь в StringUtils isAllUpperCase

15 голосов
/ 24 марта 2009

К сожалению, не библиотечная функция, но ее довольно легко свернуть самостоятельно. Если эффективность является проблемой, это может быть быстрее, чем s.toUpperCase (). Equals (s), потому что это может выручить рано.

public static boolean isUpperCase(String s)
{
    for (int i=0; i<s.length(); i++)
    {
        if (!Character.isUpperCase(s.charAt(i)))
        {
            return false;
        }
    }
    return true;
}

Редактировать: Как отмечали другие авторы и комментаторы, нам нужно учитывать поведение, когда строка содержит не буквенные символы: должен ли isUpperCase ("HELLO1") возвращать true или false? Вышеприведенная функция вернет false, потому что «1» не является символом верхнего регистра, но, возможно, это не то поведение, которое вам нужно. Альтернативное определение, которое возвратило бы true в этом случае, было бы:

public static boolean isUpperCase2(String s)
{
    for (int i=0; i<s.length(); i++)
    {
        if (Character.isLowerCase(s.charAt(i)))
        {
            return false;
        }
    }
    return true;
}
7 голосов
/ 24 марта 2009

Не то чтобы я знал.

Вы можете скопировать строку и преобразовать копию в нижний / верхний регистр и сравнить с исходной.

Или создайте цикл, который проверяет отдельные символы, если они в нижнем или верхнем регистре.

6 голосов
/ 25 сентября 2013

Это если условие может получить ожидаемый результат:

String input = "ANYINPUT";

if(input.equals(input.toUpperCase())
{
   // input is all upper case
}
else if (input.equals(input.toLowerCase())
{
   // input is all lower case
}
else
{
   // input is mixed case
}
5 голосов
/ 24 марта 2009

Этот метод может быть быстрее, чем сравнение строки с ее заглавной версией, поскольку он требует только 1 проход:

public static boolean isUpper(String s)
{
    for(char c : s.toCharArray())
    {
        if(! Character.isUpperCase(c))
            return false;
    }

    return true;
}

Обратите внимание, что могут быть некоторые проблемы локализации с разными наборами символов. У меня нет опыта из первых рук, но я думаю, что есть языки (например, турецкий), в которых разные строчные буквы могут отображаться на одну и ту же заглавную букву.

4 голосов
/ 08 августа 2016

Guava's CharMatchers , как правило, предлагают очень выразительные и эффективные решения для такого рода проблем.

CharMatcher.javaUpperCase().matchesAllOf("AAA"); // true
CharMatcher.javaUpperCase().matchesAllOf("A SENTENCE"); // false
CharMatcher.javaUpperCase().or(CharMatcher.whitespace()).matchesAllOf("A SENTENCE"); // true
CharMatcher.javaUpperCase().or(CharMatcher.javaLetter().negate()).matchesAllOf("A SENTENCE"); // true
CharMatcher.javaLowerCase().matchesNoneOf("A SENTENCE"); // true

Статический импорт для com.google.common.base.CharMatcher.* может помочь сделать их более краткими.

javaLowerCase().matchesNoneOf("A SENTENCE"); // true
4 голосов
/ 24 июня 2009

Попробуйте, может помочь.

import java.util.regex.Pattern;

private static final String regex ="^[A-Z0-9]"; //alpha-numeric uppercase
public static boolean isUpperCase(String str){
    return Pattern.compile(regex).matcher(str).find();
}

с помощью этого кода мы просто меняем регулярное выражение.

0 голосов
/ 24 марта 2009

Вы можете использовать java.lang.Character.isUpperCase () Затем вы можете легко написать метод, который проверяет, является ли ваша строка прописными (с простым циклом).

Отправка сообщения toUpperCase () в вашу строку и последующая проверка, будет ли результат равен вашей строке, возможно, будет медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...