Как проверить, содержит ли строка прописные буквы java - PullRequest
3 голосов
/ 19 марта 2020

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

else if (key.contains("QWERTYUIOPASDFGHJKLZXCVBNM")){
    UI.println("Invalid, key contains a space, illegal character");
    }

Это только обнаруживает заглавные буквы, если они написаны в этом порядке. есть ли такая команда, как key.contains, которую я должен использовать?

Ответы [ 6 ]

4 голосов
/ 19 марта 2020

С помощью потоков вы можете:

key.chars().anyMatch(Character::isUpperCase)

Это намного легче, чем регулярные выражения с точки зрения ресурсов.

2 голосов
/ 19 марта 2020

Или вы можете сделать это, как описано здесь sopheamak: Как проверить, содержит ли строка Java хотя бы одну заглавную букву, строчную букву и цифру?

В ваш пример:

else if (!key.equals(key.toLowerCase())

Если одна из букв в ключе является заглавной, она не будет соответствовать результату key.toLowerCase() и, следовательно, вернет true из-за !.

2 голосов
/ 19 марта 2020

Просто используйте правильное регулярное выражение с matcher.find()

Pattern.compile("[A-Z]").matcher(key).find()
1 голос
/ 20 марта 2020

Если вы используете Guava, вы можете получить его с помощью мощного CharMatcher:

Сначала скомпилируйте совпадение как член класса c, чтобы сделать это один раз и вам не нужно чтобы пересчитать его при каждом вызове.

private static final CharMatcher UPPERCASE_LETTER = CharMatcher.inRange('A', 'Z');

Измените его на любые буквы, которые вы действительно хотите. Например, если вам нужны некоторые акцентированные символы, вы можете расширить следующее:

private static final CharMatcher UPPERCASE_LETTER = CharMatcher.inRange('A', 'Z')
                                                               .or(CharMatcher.anyOf("ÁÀÄÂÉÈËÊÍÌÏÎÓÒÖÔÚÙÜÛ"));

Если вы ленивы и просто хотите делегировать Character::isUpperCase, это также возможно:

private static final CharMatcher UPPERCASE_LETTER = CharMatcher.forPredicate(Character::isUpperCase)

Затем в своем коде напишите следующее:

if (UPPERCASE_LETTER.matchesAnyOf(key)) {
  // Do what you want
}
1 голос
/ 20 марта 2020

Вы можете сделать это следующим образом:

public class Main {
    public static void main(String args[]) {
        String[] keys = { "HELLO", "Hello", "hello", "hello world", "Hello World" };
        for (String key : keys) {
            if (key.matches(".*[A-Z].*")) {
                System.out.println("'" + key + "' contains invalid, key contains a space, illegal character");
            } else {
                System.out.println("'" + key + "' passed the check");
            }
        }
    }
}

Вывод:

'HELLO' contains invalid, key contains a space, illegal character
'Hello' contains invalid, key contains a space, illegal character
'hello' passed the check
'hello world' passed the check
'Hello World' contains invalid, key contains a space, illegal character
1 голос
/ 19 марта 2020

Вы можете использовать Apache Commons Lang (https://commons.apache.org/proper/commons-lang/). Есть метод для этого:

else if (StringUtils.containsAny(key, "QWERTYUIOPASDFGHJKLZXCVBNM")){
    UI.println("Invalid, key contains a space, illegal character");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...