Как вывести слова из файла начинающиеся с гласной буквы?
У меня есть метод. Вроде должен работать, но не работает. Метод принимает путь к файлу и слова, которые начинаются с гласной буквы, добавляет в список. Но по итогу у меня выводит просто [].
public static List<String> getTextListFromFileByFirstSymbol(String file) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
List<String> list = new ArrayList<>();
String line;
while ((line = bufferedReader.readLine()) != null) {
Arrays.stream(line.split(" "))
.filter(i -> i.matches("[AaEeUuIiOoYy]"))
.forEach(list::add);
}
return list;
}
Содержимое моего файла
Apple Dog Apple
Dog Orange Dog
Ожидаемый вывод
[Apple, Apple, Orange]
Реальный вывод
[]
Ответы (1 шт):
Нет у вас проблем с регулярным выражением, просто вы должны помнить, что .matches() требует совпадения целой строки.
Для устранения проблемы всего-навсего проверяйте первый символ вашей строки на совпадение уже имеющегося шаблона:
Arrays.stream(line.split(" "))
.filter(i -> i.substring(0,1).matches("[AaEeUuIiOoYy]"))
.forEach(list::add);
Первый символ здесь получается с помощью i.substring(0,1).
Да, можно сократить длину выражения с помощью модификатора (?i), "(?i)[aeuioy]".
См. пример работы кода на Java:
String text = "Apple Dog Apple\nDog Orange Dog";
List<String> list = new ArrayList<>();
for (String line: text.split("\n")) {
Arrays.stream(line.split(" "))
.filter(i -> i.substring(0,1).matches("[AaEeUuIiOoYy]"))
.forEach(list::add);
}
System.out.println(list);
// => [Apple, Apple, Orange]
Хотя ^[AaEeUuIiOoYy].* в данной ситуации является решением, помните, что в общем случае, данное выражение может не сработать, так как . не находит символов перевода строки. Можно в таких случаях использовать (?s)^[AaEeUuIiOoYy].*, где (?s) — это "встроенный" модификатор Pattern.DOTALL, который позволяет . находить все символы включая символы перевода строки.