Как собрать паттерн для поиска?
Самостоятельно учу Java, решаю задачи.
Условие: Ищем нужные строки Считать с консоли имя файла. Вывести в консоль все строки из файла, которые содержат всего 2 слова из списка words. Закрыть потоки.
Пример: words содержит слова А, Б, В
Строки: В Б А Д //3 слова из words, не подходит А Б А Д //3 слова из words, не подходит Д А Д //1 слово из words, не подходит Д А Б Д //2 слова - подходит, выводим Д А А Д //2 слова - подходит, выводим
Знаю, что можно просто через сплит сделать массив, потом сравнивать его элементы с каждым элементом списка. Но хочется решить при помощи регулярных выражений. Изначально, задумка была считать строку, убрать из нее все знаки пунктуации(\pP), а потом при помощи Pattern и Matcher найти нужное и инкрементировать счетчик. Но, чую, что напортачил при создании паттерна.
public class Solution {
public static List<String> words = new ArrayList<String>();
static {
words.add("файл");
words.add("вид");
words.add("В");
}
public static void main(String[] args) {
Solution s = new Solution();
try(BufferedReader reader = new BufferedReader(new FileReader(s.fileNameReader()))){
int count = 0;
while (reader.ready()){
String str = reader.readLine();
str = str.replaceAll("\\pP", "");
Pattern pattern = Pattern.compile("(\\bфайл\\b|\\bвид\\b|\\bв\\b)");
Matcher matcher = pattern.matcher(str);
while (matcher.find()){
count++;
}
if (count == 2){
System.out.println(str);
count = 0;
}
}
}
catch (IOException e){
e.printStackTrace();
}
}
String fileNameReader() {
String name = "";
try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
name = reader.readLine();
}
catch (IOException e){
e.printStackTrace();
}
return name;
}
}
Ответы (1 шт):
Вот так вот:
^[^АБВ]*[АБВ][^АБВ]*[АБВ][^АБВ]*$
В Б А Д
А Б А Д
Д А Д
Д А Б Д
Д А А Д
А икщьекищ342пи24т 245т4 щ42т ьщ24ть 4т6 Б В
А икщьекищ342пи24т 245т4 щ42т ьщ24ть 4т6 Б киштищштецшщтищшцтиц
Находит 4, 5 и последнюю строки.