TransWikia.com

Как собрать паттерн для поиска?

Stack Overflow на русском Asked by CilitBang on December 26, 2021

Самостоятельно учу 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;
    }
} 

One Answer

Вот так вот:

^[^АБВ]*[АБВ][^АБВ]*[АБВ][^АБВ]*$

Тест https://regexr.com/590vk

В Б А Д
А Б А Д
Д А Д
Д А Б Д
Д А А Д
А икщьекищ342пи24т 245т4 щ42т ьщ24ть 4т6 Б В
А икщьекищ342пи24т 245т4 щ42т ьщ24ть 4т6 Б киштищштецшщтищшцтиц

Находит 4, 5 и последнюю строки.

Answered by dIm0n on December 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP