Por que o seguinte algoritmo não está sendo interrompido para mim? (str é a string em que estou procurando, findStr é a string que estou tentando encontrar)
String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;
while (lastIndex != -1) {
lastIndex = str.indexOf(findStr,lastIndex);
if( lastIndex != -1)
count++;
lastIndex += findStr.length();
}
System.out.println(count);
Respostas:
A última linha estava criando um problema.
lastIndex
nunca seria -1, então haveria um loop infinito. Isso pode ser corrigido movendo a última linha de código para o bloco if.fonte
Que tal usar o StringUtils.countMatches do Apache Commons Lang?
Isso gera:
fonte
StringUtils
não temcountMatches
método.Seu
lastIndex += findStr.length();
foi colocado fora dos colchetes, causando um loop infinito (quando nenhuma ocorrência foi encontrada, lastIndex sempre foifindStr.length()
).Aqui está a versão fixa:
fonte
Uma versão mais curta. ;)
fonte
return haystack.split(Pattern.quote(needle), -1).length - 1;
se por exemploneedle=":)"
,-1
ele soltará as partidas finais.Você realmente tem que lidar com a correspondência? Especialmente se tudo o que você precisa é o número de ocorrências, as expressões regulares são mais organizadas:
fonte
String str = "hel+loslkhel+lodjladfjhel+lo"; Pattern p = Pattern.compile("hel+lo");
Pattern.compile("hel\\+lo");
o+
sinal tem um significado especial em uma regex e precisa ser escapado.Pattern.quote(str)
é seu amigo!Estou muito surpreso que ninguém tenha mencionado esse forro. É simples, conciso e tem um desempenho um pouco melhor do que
str.split(target, -1).length-1
fonte
Aqui está, embrulhado em um método agradável e reutilizável:
fonte
no final da contagem de loop é 3; espero que ajude
fonte
findStr.length() - 1
retorno é 0 e estamos em um ciclo sem fim.Muitas das respostas fornecidas falham em um ou mais dos seguintes:
Aqui está o que eu escrevi:
Chamada de exemplo:
Se você deseja uma pesquisa sem expressão regular, compile seu padrão adequadamente com o
LITERAL
sinalizador:fonte
fonte
replace
, notreplaceAll
.Incremente
lastIndex
sempre que procurar a próxima ocorrência.Caso contrário, ele sempre encontrará a primeira substring (na posição 0).
fonte
Retorna o índice dentro dessa cadeia de caracteres da primeira ocorrência do caractere especificado, iniciando a pesquisa no índice especificado.
Portanto, seu
lastindex
valor é sempre 0 e sempre encontra olá na string.fonte
A resposta dada como correta não é boa para contar coisas como retornos de linha e é muito detalhada. Respostas posteriores são melhores, mas tudo pode ser alcançado simplesmente com
Não descarta correspondências finais usando o exemplo na pergunta.
fonte
Você pode numerar ocorrências usando a função de biblioteca embutida:
fonte
tente adicionar
lastIndex+=findStr.length()
ao final do seu loop, caso contrário, você terminará em um loop sem fim, porque depois de encontrar a substring, você está tentando encontrá-lo repetidamente da mesma última posição.fonte
Tente este. Ele substitui todos os jogos por um
-
.E se você não quer destruir o seu,
str
você pode criar uma nova string com o mesmo conteúdo:Depois de executar este bloco, estes serão seus valores:
fonte
Como @Mr_and_Mrs_D sugeriu:
fonte
Com base nas respostas existentes, gostaria de adicionar uma versão "mais curta" sem o if:
fonte
Aqui está a versão avançada para contar quantas vezes o token ocorreu em uma sequência inserida pelo usuário:
fonte
Este método abaixo mostra quantas vezes a substring se repete em toda a sua string. Espero usar completo para você: -
fonte
aqui está a outra solução sem o uso de regexp / patterns / matchers ou mesmo sem o uso de StringUtils.
fonte
Se você precisar do índice de cada substring na string original, poderá fazer algo com o indexOf assim:
fonte
}
fonte
Esta solução imprime o número total de ocorrências de uma determinada substring em toda a cadeia, incluindo também os casos em que existem correspondências sobrepostas.
fonte