Выбрать из строки все аббревиатуры
Аббревиатурой будем считать слово от 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 шт):
Для распознавания любых заглавных букв (включая Ё) следует использовать класс \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());
}