Помогите решать задачу через регулярные выражения на java
Натыкал немного кода. Не понимаю, что не так. Подсвечивает одно из условий желтым. Пожалуйста, не опускайте вопрос. Правда помощь нужна, мне сегодня нужно задачу сдать.
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);
}
}
В универе дали задачу, нужно решить через регулярные выражения. Я отдаленно понимаю как, но просто времени нет.
Ответы (1 шт):
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, КТО]