Comment puis-je compter le nombre de fois qu'une chaîne particulière se produit dans une autre chaîne. Par exemple, voici ce que j'essaie de faire en Javascript:
var temp = "This is a string.";
alert(temp.count("is")); //should output '2'
javascript
regex
string
TruMan1
la source
la source
Réponses:
Le
g
dans l'expression régulière (abréviation de global ) dit de rechercher la chaîne entière plutôt que de simplement trouver la première occurrence. Cela correspondis
deux fois:Et, s'il n'y a pas de correspondance, il renvoie
0
:la source
count = (str.match(/is/g) || []).length
gérer si vous n'avez pas de match.RegExp
constructeur et en passant la chaîne que vous recherchez, mais dans ce cas, vous devez échapper à tous les métacaractères. Dans ce scénario, une approche de chaîne pure est préférable.Usage
allowOverlapping
Allumettes:
Test de l'unité
Référence
Essentiella source
substring.length
presque toutes les boucles, vous devriez envisager de le mettre en cache en dehors dewhile
occurrences(11,1) //2
et cela fonctionnerait toujours. (Il est plus rapide de procéder de cette façon au lieu de vérifier les types et d'appeler toString () )la source
countInstances("isisisisisis", "is") === 0
.Vous pouvez essayer ceci:
la source
theString.split(myvar).length - 1
que vous ne pouvez pas utiliser avec des expressions rationnelles simplesMa solution:
la source
countOcurrences('Hello...','.')==8
pas 3Vous pouvez utiliser
match
pour définir une telle fonction:la source
return m ? m.length:-1;
.La version non regex:
la source
is
occurrencesLa solution de Rebecca Chernoff juste pour jouer au golf :-)
la source
Cela retournera 2.
la source
Voici la fonction la plus rapide!
Pourquoi est-ce plus rapide?
Toutes les opérations sont aussi combinées que possible, évitant les ralentissements dus à plusieurs opérations
Voici une version plus lente et plus lisible:
Celui-ci est plus lent à cause du compteur, des noms de var longs et de la mauvaise utilisation de 1 var.
Pour l'utiliser, vous faites simplement ceci:
Modifier: (2013/12/16)
NE PAS utiliser avec Opera 12.16 ou plus! cela prendra presque 2,5 fois plus que la solution regex!
Sur Chrome, cette solution prendra entre 14 ms et 20 ms pour 1 000 000 de caractères.
La solution d'expression régulière prend 11-14 ms pour le même montant.
L'utilisation d'une fonction (à l'extérieur
String.prototype
) prendra environ 10 à 13 ms.Voici le code utilisé:
Le résultat de toutes les solutions devrait être de 100 000!
Remarque: si vous voulez que cette fonction compte plus de 1 char, changement où est
c=(c+'')[0]
enc=c+''
la source
la source
Je pense que le but de regex est très différent de
indexOf
.indexOf
trouvez simplement l'occurrence d'une certaine chaîne tandis qu'en regex vous pouvez utiliser des caractères génériques comme[A-Z]
ce qui signifie qu'il trouvera tout caractère majuscule dans le mot sans indiquer le caractère réel.Exemple:
la source
Super duper old, mais j'avais besoin de faire quelque chose comme ça aujourd'hui et je ne pensais qu'à vérifier SO après. Fonctionne assez rapidement pour moi.
la source
Voir: - compter une sous-chaîne apparaît dans la chaîne pour une explication étape par étape.
la source
S'appuyant sur la réponse de @ Vittim.us ci-dessus. J'aime le contrôle que sa méthode me donne, le rendant facile à étendre, mais je devais ajouter une insensibilité à la casse et limiter les correspondances à des mots entiers avec un support pour la ponctuation. (par exemple "bain" signifie "prendre un bain" mais pas "bain")
Le regex de ponctuation provient de: https://stackoverflow.com/a/25575009/497745 ( Comment puis-je supprimer toute la ponctuation d'une chaîne en JavaScript en utilisant regex? )
N'hésitez pas à modifier et à refactoriser cette réponse si vous détectez des bugs ou des améliorations.
la source
Pour tous ceux qui trouveront ce fil à l'avenir, notez que la réponse acceptée ne retournera pas toujours la valeur correcte si vous la généralisez, car elle étouffera les opérateurs regex comme
$
et.
. Voici une meilleure version, qui peut gérer n'importe quelle aiguille:la source
Utilisez get_occurrence (varS, chaîne) pour rechercher l'occurrence des caractères et de la chaîne dans une chaîne.
la source
Essayez-le
la source
Version simple sans regex:
la source
Personne ne le verra jamais, mais il est bon de ramener de temps en temps les fonctions de récursivité et de flèche (jeu de mots glorieusement destiné)
la source
Essaye ça
Lien Fiddle: https://jsfiddle.net/rajaramtt/gn0dtsjc/1/
la source
Maintenant, c'est un très vieux fil que j'ai rencontré mais comme beaucoup ont poussé leurs réponses, voici le mien dans l'espoir d'aider quelqu'un avec ce code simple.
Je ne sais pas si c'est la solution la plus rapide mais je l'ai préférée pour la simplicité et pour ne pas utiliser regex (je n'aime tout simplement pas les utiliser!)
la source
Cette fonction renvoie le nombre d'occurrences d'un mot dans le texte.
Notez que nous utilisons toLowerCase pour calculer le nombre d'occurrences quel que soit le format (majuscule, majuscule ...) du mot et du texte
la source
Réponse pour Leandro Batista: juste un problème avec l'expression regex.
la source
la source
Un peu en retard mais, en supposant que nous ayons la chaîne suivante:
Nous divisons d'abord tout ce que vous cherchez à faire correspondre, cela renverra un tableau de chaînes.
Ensuite, nous obtenons sa longueur et lui soustrayons 1, car split par défaut est un tableau de taille 1 et, par conséquent, augmente sa taille à chaque fois qu'il trouve une occurrence.
Vous pouvez également faire tout cela en une seule ligne comme suit:
J'espère que cela aide: D
la source
Cette solution est basée sur la
.replace()
méthode qui accepte un RegEx comme premier paramètre et une fonction comme deuxième paramètre que nous pouvons utiliser comme fermeture pour incrémenter un compteur ...Usage
la source
tombé sur ce post.
Le même algorithme peut être plus court:
la source
substr_count
traduit en Javascript depuis phpConsultez la traduction de Locutus de la fonction substr_count de Php
la source
Essaye ça:
la source