Digamos que eu tenha uma string que contém isto:
HelloxxxHelloxxxHello
Eu compilo um padrão para procurar 'Olá'
Pattern pattern = Pattern.compile("Hello");
Matcher matcher = pattern.matcher("HelloxxxHelloxxxHello");
Deve encontrar três correspondências. Como posso contar quantas partidas existiram?
Eu tentei vários loops e usando o matcher.groupCount()
mas não funcionou.
Respostas:
matcher.find()
não encontra todas as correspondências, apenas a próxima correspondência.Solução para Java 9+
Solução para Java 8 e anterior
Você terá que fazer o seguinte. ( A partir do Java 9, há uma solução mais agradável )
Aliás,
matcher.groupCount()
é algo completamente diferente.Exemplo completo :
Tratamento de correspondências sobrepostas
Ao contar as correspondências de
aa
noaaaa
snippet acima, você obterá 2 .Para obter 3 correspondências, ou seja, este comportamento:
Você deve pesquisar uma correspondência no índice da
<start of last match> + 1
seguinte maneira:fonte
while(matcher.find()){ matcher.region(matcher.end()-1, str.length()); count++; }
Isso deve funcionar para correspondências que podem se sobrepor:
fonte
No Java 9, você pode usar o fluxo fornecido por
Matcher.results()
fonte
Se você quiser usar fluxos Java 8 e for alérgico a
while
loops, pode tentar o seguinte:Isenção de responsabilidade: isso só funciona para partidas disjuntas.
Exemplo:
Isso imprime:
Esta é uma solução para partidas disjuntas com streams:
fonte
Use o código abaixo para encontrar a contagem do número de correspondências que a regex encontra em sua entrada
Este é um código generalizado, não específico, porém, adapte-o para atender às suas necessidades
Sinta-se à vontade para me corrigir se houver algum erro.
fonte