Выбрать из строки все аббревиатуры

Аббревиатурой будем считать слово от 2 до 6 символов, состоящее только из больших букв без чисел. Словом считается непрерывная последовательность символов (строчных и прописных) А-Я, A-Z и цифр:

public static void main(String[] args) {
    String example = "fv345vABCrfЯRЯ";
    String regEx = "(\\p{Lu}{2,6})";
    Pattern pattern = Pattern.compile(regEx);
    Matcher matcher = pattern.matcher(example);
    while (matcher.find()) {
        // как сделать вывод аббревиатур в виде списка?
    }
}

Пример: String s = "fv345ABCrfЯRЯ";

Вывод: ABC ЯRЯ


Ответы (1 шт):

Автор решения: Alex Rudenko

Для распознавания любых заглавных букв (включая Ё) следует использовать класс \p{Lu} (сокращённое название для \p{Uppercase_Letter}).

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

String s = "fv345ABCrfЯRЁЯ.КРАЇНА_Қазақстан/ЎРОК|PÂTÉfon";

Pattern.compile("\\p{Lu}{2,6}")
    .matcher(s)
    .results() // Stream<MatchResult> 
    .map(MatchResult::group) // Stream<String> аббревиатуры
    .forEach(System.out::println);

Вывод:

ABC
ЯRЁЯ
КРАЇНА
ЎРОК
PÂTÉ

Для получения списка/массива аббревиатур, вместо forEach(System.out::println) использовать метод Stream::collect с соответствующим коллектором Collectors.toList(), Stream::toList (Java 16+), или Stream::toArray:

List<String> abbrs = Pattern.compile("\\p{Lu}{2,6}")
    .matcher(s)
    .results()
    .map(MatchResult::group)
    .collect(Collectors.toList());

Без Stream API:

List<String> abbrs = new ArrayList<>();
Matcher m = Pattern.compile("\\p{Lu}{2,6}").matcher(s);
while(m.find()) {
    abbrs.add(m.group());
}
→ Ссылка