количество совпадений регулярных выражений java



Допустим у меня есть файл, содержащий этот:



HelloxxxHelloxxxHello


я компилирую шаблон для поиска 'Hello'



Pattern pattern = Pattern.compile("Hello");


затем я использую inputstream для чтения в файле и преобразования его в строку, чтобы он мог быть регексирован.



Как только сопоставитель находит совпадение в файле, он указывает на это, но он не говорит мне, сколько совпадений он нашел; просто он нашел совпадение в строке.



Итак, поскольку строка относительно короткая, и буфер, который я использую, составляет 200 байт, он должен найти три совпадения. Однако он просто говорит match, и не дает мне подсчета того, сколько матчей было.



каков самый простой способ подсчета количества совпадений, которые произошли в строке. Я пробовал различные для петель и с помощью matcher.groupCount () но я ничего не получаю быстро.

1667   4  

4 ответов:

matcher.find() не нашел все матчи, только далее матч.

вам придется сделать следующее:

int count = 0;
while (matcher.find())
    count++;

кстати, matcher.groupCount() это что-то совершенно другое.

пример:

import java.util.regex.*;

class Test {
    public static void main(String[] args) {
        String hello = "HelloxxxHelloxxxHello";
        Pattern pattern = Pattern.compile("Hello");
        Matcher matcher = pattern.matcher(hello);

        int count = 0;
        while (matcher.find())
            count++;

        System.out.println(count);    // prints 3
    }
}

обработка перекрывающихся матчей

при подсчете матчей aa на aaaa приведенный выше фрагмент даст вам 2.

aaaa
aa
  aa

To получаем 3 совпадения, т. е. Такое поведение:

aaaa
aa
 aa
  aa

вы должны искать совпадение по индексу <start of last match> + 1 следующим образом:

String hello = "aaaa";
Pattern pattern = Pattern.compile("aa");
Matcher matcher = pattern.matcher(hello);

int count = 0;
int i = 0;
while (matcher.find(i)) {
    count++;
    i = matcher.start() + 1;
}

System.out.println(count);    // prints 3

Это должно работать для непересекающихся матчей:

public static void main(String[] args) {
    String input = "aaaaaaaa";
    String regex = "aa";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);
    int from = 0;
    int count = 0;
    while(matcher.find(from)) {
        count++;
        from = matcher.start() + 1;
    }
    System.out.println(count);
}

Это может помочь:

public static void main(String[] args) {
    String hello = "HelloxxxHelloxxxHello";
    String []matches = hello.split("Hello");
    System.out.println(matches.length);    // prints 3
}

если вы хотите использовать Java 8 потоков и аллергия на while петли, вы можете попробовать это:

public static int countPattern(String references, Pattern referencePattern) {
    Matcher matcher = referencePattern.matcher(references);
    return Stream.iterate(0, i -> i + 1)
            .filter(i -> !matcher.find())
            .findFirst()
            .get();
}

отказ от ответственности: это работает только для непересекающихся играм.

пример:

public static void main(String[] args) throws ParseException {
    Pattern referencePattern = Pattern.compile("PASSENGER:\d+");
    System.out.println(countPattern("[ \"PASSENGER:1\", \"PASSENGER:2\", \"AIR:1\", \"AIR:2\", \"FOP:2\" ]", referencePattern));
    System.out.println(countPattern("[ \"AIR:1\", \"AIR:2\", \"FOP:2\" ]", referencePattern));
    System.out.println(countPattern("[ \"AIR:1\", \"AIR:2\", \"FOP:2\", \"PASSENGER:1\" ]", referencePattern));
    System.out.println(countPattern("[  ]", referencePattern));
}

эта команда выведет:

2
0
1
0

Comments

    Ничего не найдено.