Как сопоставить текстовый файл с несколькими шаблонами регулярных выражений и подсчитать количество вхождений этих шаблонов?

Я хочу найти и подсчитать все вхождения слов unit, device, method, module в каждой строке текстового файла отдельно. Это то, что я сделал, но я не знаю, как использовать несколько шаблонов и как посчитать появление каждого слова в строке отдельно? Теперь он считает только вхождения всех слов вместе для каждой строки. Заранее спасибо!

private void countPaterns() throws IOException {

    Pattern nom = Pattern.compile("unit|device|method|module|material|process|system");

    String str = null;      

    BufferedReader r = new BufferedReader(new FileReader("D:/test/test1.txt")); 

    while ((str = r.readLine()) != null) {
        Matcher matcher = nom.matcher(str);

        int countnomen = 0;
        while (matcher.find()) {
            countnomen++;
        }

        //intList.add(countnomen);
        System.out.println(countnomen + " davon ist das Wort System");
    }
    r.close();
    //return intList;
}

person Oleg_08    schedule 29.10.2015    source источник
comment
Пожалуйста, добавьте полезные теги, например, какой язык вы используете. count, matcher и find-occurences бесполезны для этого вопроса.   -  person miken32    schedule 29.10.2015


Ответы (1)


Лучше использовать границу слова и использовать карту для подсчета каждого совпадающего ключевого слова.

Pattern nom = Pattern.compile("\\b(unit|device|method|module|material|process|system)\\b");

String str = null;
BufferedReader r = new BufferedReader(new FileReader("D:/test/test1.txt"));
Map<String, Integer> counts = new HashMap<>();

while ((str = r.readLine()) != null) {
    Matcher matcher = nom.matcher(str);

    while (matcher.find()) {
        String key = matcher.group(1);
        int c = 0;
        if (counts.containsKey(key))
            c = counts.get(key);
        counts.put(key, c+1)
    }
}
r.close();

System.out.println(counts);
person anubhava    schedule 29.10.2015
comment
Спасибо! это работает очень хорошо, но единственная проблема в том, что я получаю количество вхождений для всего текстового файла. Но мне нужно получить этот номер для каждой новой строки текста отдельно. До вашего изменения он работал для каждой строки - person Oleg_08; 30.10.2015
comment
Если вы хотите подсчитать количество строк, добавьте counts.clear() после строки Matcher matcher = nom.matcher(str); и обязательно напечатайте его внутри внешнего цикла while. - person anubhava; 30.10.2015