Помогите решать задачу через регулярные выражения на java

Рейтинг: -5Ответов: 1Опубликовано: 15.01.2023

Натыкал немного кода. Не понимаю, что не так. Подсвечивает одно из условий желтым. Пожалуйста, не опускайте вопрос. Правда помощь нужна, мне сегодня нужно задачу сдать.

public class Main {
public static void main(String[] args){
    String text = "go to ABC electro 77";
    String[] parts = text.split("[,;:\\s+]");
    for (String  p : parts){
        System.out.print("["+ p +"],");
    }
    System.out.println();
    int counter = 0;

    for (String  p : parts){
        if ((p.length() <= 6) && (p.length() >= 2) && (p.contains("[^a-z]")) && (p.contains("[^0-9]")) && (p.contains("[A-Z]"))){
            counter++;
        }
    }
    System.out.println(counter);
}

}

условие Задача В универе дали задачу, нужно решить через регулярные выражения. Я отдаленно понимаю как, но просто времени нет.

Ответы

▲ 0

String::contains НЕ использует регулярные выражения, он проверяет вхождение подстроки в строку, поэтому и получается предупреждение об излишней проверке длины строки на 2 и больше, так как подстроки-аргументы в contains имеют длину 6 и 5 символов.

В вашем подходе достаточно заменить String::contains на String::matches с регулярным выражением [A-ZА-ЯЁ]{2,6}, проверяющим сразу ограничение на минимальную и максимальную длину:

for (String  p : parts) {
    if (p.matches("[A-ZА-ЯЁ]{2,6}")) {
        counter++;
    }
}

Похожее решение с использованием Stream API, реализованное в виде отдельной функции, возвращающей список аббревиатур:

public static List<String> getAbbrevs(String str) {
    return Arrays.stream(str.split("[\\p{Z}\\p{P}]+"))
        .filter(s -> s.matches("\\p{Lu}{2,6}"))
        .collect(Collectors.toList());
}

Также здесь используются Unicode-категории:

  • p{Z} - любые пробельные символы, включая невидимые
  • p{P} - любые символы пунктуации
  • p{Lu} - любые прописные буквы (не только английские и русские)

Тест:

String text = "go to ABC electro 77 I am MUZzY IQ Ok КТО Здесь? ЗДРАСТЕ";

System.out.println(getAbbrevs(text));

// -> [ABC, IQ, КТО]