contagem de correspondências java regex

Digamos que eu tenha um arquivo e o arquivo contenha isto:

HelloxxxHelloxxxHello 

Eu compilo um padrão para procurar por ‘Olá’

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

Então eu uso um stream de input para ler o arquivo e convertê-lo em uma String para que possa ser regexed.

Depois que o matcher encontrar uma correspondência no arquivo, isso indica isso, mas não informa quantas correspondências ele encontrou; simplesmente que encontrou uma correspondência dentro da String.

Então, como a string é relativamente curta, e o buffer que estou usando é de 200 bytes, ela deve encontrar três correspondências. No entanto, simplesmente diz match e não me fornece uma contagem de quantas partidas houve.

Qual é a maneira mais fácil de contar o número de correspondências que ocorreram na String. Eu tentei vários loops for e usando o matcher.groupCount (), mas estou chegando a lugar nenhum rápido.

matcher.find() não encontra todas as correspondências, apenas a próxima partida.

Você terá que fazer o seguinte:

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

Btw, matcher.groupCount() é algo completamente diferente.


Exemplo completo :

 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 } } 

Isso deve funcionar para correspondências não disjuntas:

 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); } 

Isso pode ajudar:

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

Se você quiser usar streams Java 8 e é alérgico a loops while , você pode tentar isto:

 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(); } 

Aviso: isso só funciona para correspondências disjuntas.

Exemplo:

 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)); } 

Isso imprime:

 2 0 1 0