Pourquoi l'algorithme suivant ne s'arrête pas pour moi? (str est la chaîne dans laquelle je recherche, findStr est la chaîne que j'essaie de trouver)
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);
Réponses:
La dernière ligne créait un problème.
lastIndex
ne serait jamais à -1, donc il y aurait une boucle infinie. Cela peut être résolu en déplaçant la dernière ligne de code dans le bloc if.la source
Que diriez-vous d'utiliser StringUtils.countMatches d'Apache Commons Lang?
Cela produit:
la source
StringUtils
n'a pas decountMatches
méthode.Votre a
lastIndex += findStr.length();
été placé en dehors des crochets, provoquant une boucle infinie (quand aucune occurrence n'a été trouvée, lastIndex était toujours àfindStr.length()
).Voici la version fixe:
la source
Une version plus courte. ;)
la source
return haystack.split(Pattern.quote(needle), -1).length - 1;
si par exempleneedle=":)"
,-1
cela, les correspondances de fin seront supprimées .Devez-vous vraiment gérer la correspondance vous-même? Surtout si tout ce dont vous avez besoin est le nombre d'occurrences, les expressions régulières sont plus ordonnées:
la source
String str = "hel+loslkhel+lodjladfjhel+lo"; Pattern p = Pattern.compile("hel+lo");
Pattern.compile("hel\\+lo");
le+
signe a une signification particulière dans une expression régulière et doit être échappé.Pattern.quote(str)
c'est votre ami!Je suis très surpris que personne n'ait mentionné cette seule doublure. C'est simple, concis et fonctionne légèrement mieux que
str.split(target, -1).length-1
la source
Le voici, enveloppé dans une méthode agréable et réutilisable:
la source
à la fin du nombre de boucles, 3; J'espère que ça aide
la source
findStr.length() - 1
retourne 0 et nous sommes dans un cycle sans fin.Un grand nombre des réponses données échouent sur un ou plusieurs des éléments suivants:
Voici ce que j'ai écrit:
Exemple d'appel:
Si vous voulez une recherche non-expression régulière, compilez simplement votre modèle de manière appropriée avec l'
LITERAL
indicateur:la source
la source
replace
, nonreplaceAll
.Incrémentez
lastIndex
chaque fois que vous recherchez la prochaine occurrence.Sinon, il trouve toujours la première sous-chaîne (à la position 0).
la source
Renvoie l'index dans cette chaîne de la première occurrence du caractère spécifié, en commençant la recherche à l'index spécifié.
Donc, votre
lastindex
valeur est toujours 0 et elle trouve toujours bonjour dans la chaîne.la source
La réponse donnée comme correcte n'est pas bonne pour compter des choses comme les retours de ligne et est beaucoup trop verbeuse. Les réponses ultérieures sont meilleures mais tout peut être réalisé simplement avec
Il ne supprime pas les correspondances de fin en utilisant l'exemple de la question.
la source
Vous pouvez nombre d'occurrences en utilisant la fonction de bibliothèque intégrée:
la source
essayez d'ajouter
lastIndex+=findStr.length()
à la fin de votre boucle, sinon vous vous retrouverez dans une boucle sans fin car une fois que vous avez trouvé la sous-chaîne, vous essayez de la retrouver encore et encore à partir de la même dernière position.la source
Essaye celui-là. Il remplace toutes les correspondances par un
-
.Et si vous ne voulez pas détruire votre,
str
vous pouvez créer une nouvelle chaîne avec le même contenu:Après avoir exécuté ce bloc, ce seront vos valeurs:
la source
Comme @Mr_and_Mrs_D l'a suggéré:
la source
Sur la base des réponses existantes, j'aimerais ajouter une version "plus courte" sans le si:
la source
Voici la version avancée pour compter le nombre de fois où le jeton s'est produit dans une chaîne saisie par l'utilisateur:
la source
Cette méthode ci-dessous montre combien de fois la sous-chaîne se répète sur toute votre chaîne. J'espère utiliser pleinement pour vous: -
la source
voici l'autre solution sans utiliser regexp / patterns / matchers ou même sans utiliser StringUtils.
la source
Si vous avez besoin de l'index de chaque sous-chaîne dans la chaîne d'origine, vous pouvez faire quelque chose avec indexOf comme ceci:
la source
}
la source
Cette solution imprime le nombre total d'occurrences d'une sous-chaîne donnée tout au long de la chaîne, inclut également les cas où des correspondances se chevauchent.
la source