количество совпадений регулярных выражений java
Допустим у меня есть файл, содержащий этот:
HelloxxxHelloxxxHello
я компилирую шаблон для поиска 'Hello'
Pattern pattern = Pattern.compile("Hello");
затем я использую inputstream для чтения в файле и преобразования его в строку, чтобы он мог быть регексирован.
Как только сопоставитель находит совпадение в файле, он указывает на это, но он не говорит мне, сколько совпадений он нашел; просто он нашел совпадение в строке.
Итак, поскольку строка относительно короткая, и буфер, который я использую, составляет 200 байт, он должен найти три совпадения. Однако он просто говорит match, и не дает мне подсчета того, сколько матчей было.
каков самый простой способ подсчета количества совпадений, которые произошли в строке. Я пробовал различные для петель и с помощью matcher.groupCount () но я ничего не получаю быстро.
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 aaTo получаем 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