Compter le nombre d'occurrences d'un caractère dans une chaîne de caractères en Javascript
J'ai besoin de compter le nombre d'occurrences d'un caractère dans une chaîne.
Par exemple, supposons que ma chaîne contient:
var mainStr = "str1,str2,str3,str4";
Je veux savoir le nombre de virgule ,
caractère, qui est de 3. Et le nombre de chaînes individuelles après la séparation le long de la virgule, qui est de 4.
J'ai aussi besoin de valider que chacune des chaînes.e ch1 ou ch2 ou str3 ou str4 ne doit pas dépasser, disons, 15 caractères.
Vous devez vous connecter pour publier un commentaire.
J'ai mis à jour cette réponse. J'aime l'idée de l'utilisation d'un match de mieux, mais il est plus lent:
jsfiddle
Utiliser une expression régulière littérale si vous savez ce que vous cherchez à l'avance, si non, vous pouvez utiliser le
RegExp
constructeur, et de passer dans leg
drapeau comme un argument.match
retournenull
sans résultats donc la|| []
L'original de la réponse que j'ai faite en 2009 est ci-dessous. Il crée un tableau inutilement, mais l'aide d'une scission est plus rapide (à compter de septembre 2014). Je suis ambivalent, si j'ai vraiment besoin de la vitesse il n'y aurait pas de question que je voudrais utiliser un split, mais je préfère utiliser la correspondance.
Vieille réponse (à partir de 2009):
Si vous êtes à la recherche pour les virgules:
Si vous êtes à la recherche pour le str
À la fois dans @Lo réponse et dans mon idiot jsperf test split vient d'avance à la vitesse, au moins dans Chrome, mais encore de la création de la collection supplémentaire ne semble tout simplement pas sain d'esprit.
Console.log(("str1,str2,str3,str4".match(/./g) || []).length);
qui retourne le résultat inattendu.console.log(("^str1^str2^str3^str4".match(/^/g) || []).length);
il enregistre: 1. Ce qui me manque ici?/\^/g
au lieu de cela, pour correspondre à un littéral^
caractère.Il y a au moins quatre façons. La meilleure option, qui doit aussi être le plus rapide en raison de la maternelle moteur d'expressions régulières -, est placé dans la partie supérieure. jsperf.com est actuellement en panne, sinon, je voudrais vous fournir des statistiques de performance.
Mise à jour: Veuillez trouver les tests de performance ici, et de les exécuter vous-mêmes, afin de contribuer vos résultats. Les détails des résultats seront donnés plus tard.
1.
2.
split n'est pas recommandée. Gourmandes en ressources. Alloue de nouvelles instances de "Tableau" pour chaque match. N'essayez pas que pour a >100 MO de fichiers via FileReader. Vous pouvez effectivement facilement observer avec précision l'utilisation des ressources à l'aide de Chrome profiler option.
3.
4.
rechercher un caractère unique
Mise à jour:
5.
élément de cartographie et de filtrage, n'est pas recommandée en raison de l'ensemble de ses ressources preallocation plutôt que d'utiliser Pythonian générateurs
Partager:
J'ai fait ce gist, avec actuellement 8 méthodes de caractères de comptage, nous pouvons donc directement de la piscine et de partager nos idées, juste pour le plaisir, et peut-être à certains intéressant de référence 🙂
https://gist.github.com/2757250
||[]
a été fait, mais cette réponse est génial! Pour quelqu'un d'autre se gratter la tête,match()
retournenull
si aucune correspondance n'est trouvée et||[]
sera de retour d'une longueur 0 tableau si lematch()
retournenull
, senslength()
sera de retour 0 au lieu de produire un type d'erreur.index = -2
, mais merci beaucoup @Augustesplit
) est le plus rapide.map
et puisfilter(Boolean)
plutôt que de simplementfilter
par le caractère #5?Ajouter cette fonction à sting prototype :
utilisation:
Un rapide Google recherche a obtenu ce (à partir de http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript)
L'utiliser comme ceci:
*
char (SyntaxError: nothing to repeat
)Simplement, utiliser le split pour trouver le nombre d'occurrences d'un caractère dans une chaîne.
mainStr.split(',').length
//donne 4, qui est le nombre de chaînes après fractionnement à l'aide de séparateur virgulemainStr.split(',').length - 1
//donne 3, qui est le nombre de virguleJ'ai trouvé que la meilleure approche pour rechercher un caractère dans une très grande chaîne (qui est de 1 000 000 de caractères, par exemple) est d'utiliser la
replace()
méthode.Vous pouvez voir encore un autre JSPerf suite pour tester cette méthode avec d'autres méthodes de recherche d'un caractère dans une chaîne.
Voici une solution similaire, mais il utilise
Array.ptototype.reduce
Comme il a été mentionné,
String.prototype.split
fonctionne beaucoup plus rapidement queString.prototype.replace
.ok, une autre avec les regexp - probablement pas rapide, mais de courte durée et mieux lisible, alors les autres, dans mon cas il suffit de
'_'
à compterjuste supprimer tout ce qui ne ressemble pas à votre char
mais il n'a pas l'air agréable avec une chaîne en entrée
Performance de Split vs RegExp
JS:
Façon la plus simple que j'ai découvert...
Exemple-
Je travaille sur un petit projet qui a exigé une sous-chaîne de contre. La recherche pour le mal de phrases m'ont fourni aucun résultat, cependant après avoir écrit ma propre mise en œuvre, j'ai trébuché sur cette question. De toute façon, ici, c'est mon chemin, il est probablement plus lent que la plupart ici, mais pourrait être utile à quelqu'un:
http://jsfiddle.net/5ZzHt/1/
S'il vous plaît laissez-moi savoir si vous trouvez cette mise en œuvre d'échouer ou de ne pas suivre certaines normes! 🙂
Mise à JOUR
Vous pouvez remplacer:
Avec:
Lecture intéressante à discuter de ce qui précède:
http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value
J'ai fait une légère amélioration sur la accepté de répondre, il permet de vérifier avec la casse/insensible à la casse, et est une méthode liée à la chaîne de l'objet:
lit
est la chaîne de caractères à rechercher ( tels que les "ex"), et de la cei est l'insensibilité à la casse, par défaut à false, il permettra le choix de la casse des matchs.Pour rechercher la chaîne de
'I love StackOverflow.com'
pour la lettre minuscule'o'
, vous pouvez utiliser:amount_of_os
serait égale à2
.Si nous étions à la recherche de la même chaîne de nouveau à l'aide de comparaison insensible à la casse, vous pouvez utiliser:
Ce temps,
amount_of_os
serait égale à3
, depuis la capitaleO
de la chaîne est inclus dans la recherche.Vous pouvez également reste votre chaîne et de travailler avec elle comme un tableau d'éléments à l'aide de
JS:
Ou
JS:
Si vous utilisez lodash, le _.countBy méthode fera ce:
De plus, cette méthode de travail avec le tableau:
Voici ma solution. Beaucoup de solution déjà posté avant moi. Mais j'aime partager mon point de vue ici.
Vous trouverez ici mes REPL
Celui-ci utilise une expression régulière pour tester la longueur. testex assure que vous n'avez pas 16 ou plus consécutifs de non-virgules. Si elle passe le test, alors il procède à la scission de la chaîne. compter les virgules est aussi simple que de compter les jetons moins un.
Qu'en chaîne.split(desiredCharecter).longueur-1
Exemple:
var str = "hellow comment est la vie";
var len = str.split("h").longueur-1; donnera compter 2 pour le caractère "h" au-dessus de la chaîne;
Je suis en utilisant Node.js v. 6.0.0 et la plus rapide est l'un avec de l'index (la 3ème méthode dans Lo Sauer réponse).
La seconde est:
JS:
Ici est presque aussi rapide que la répartition et la remplacer méthodes, qui sont un tout petit peu plus rapide que la regex méthode (dans chrome).
J'ai juste fait une très rapide et sale de test sur repl.il l'aide d'un Noeud v7.4. Pour un seul personnage, le standard pour la boucle est la plus rapide:
Du code:
Résultats de quelques pistes de:
Et il est:
Travaille avec des entiers trop!
Ma solution:
String.prototype.match
retournenull
sans allumettes. Cela signifie qu'aucune référence à un objet avec unlength
attribut. En d'autres termes:String.prototype.match.call('willnotwork', /yesitwill/) === null
La cinquième méthode de Leo Sauers réponse échoue, si le personnage est sur le début de la chaîne.
par exemple,
donnera 2 au lieu de 3, parce que le filtre de fonction Booléenne donne de faux pour 0.
Autres fonction de filtre:
Je sais que cela peut être une vieille question, mais j'ai une solution simple pour un faible niveau niveau débutant en JavaScript.
En tant que débutant, je ne pouvais comprendre certaines des solutions à cette question, j'ai donc utilisé deux imbriqués POUR boucles de vérifier chaque personnage contre tous les autres caractères d'une chaîne, incrémentation d'une compter variable pour chaque caractère qui est égale à celle des caractères.
J'ai créé un nouvel objet vide où chaque propriété clé est d'un caractère et la valeur est le nombre de fois que chaque personnage est apparu dans la chaîne(le comte).
Exemple la fonction de:-
Je crois que vous trouverez ci-dessous la solution pour être très court, très rapide, capable de travailler avec de très longues chaînes, en mesure de soutenir plusieurs caractères de recherches, à l'abri des erreurs, et capable de gérer une chaîne vide recherches.
Exemple d'utilisation:
JS:
Le code ci-dessus fixe les grandes performances bug dans Jakub Wawszczyk est que le code continue à la recherche d'un match, et même après indexOf affirme qu'il n'y est aucune et sa version en soi n'est pas de travail parce qu'il a oublié de donner la fonction des paramètres d'entrée.
La méthode la plus rapide semble être via l'index de l'opérateur:
Utilisation:
Ou comme un prototype de la fonction:
Utilisation:
En javascript, vous pouvez utiliser le code ci-dessus pour obtenir de l'occurrence d'un caractère dans une chaîne.
Ma solution avec ramda js:
Lien vers REPL.
La fonction prend string str comme paramètre, et compte occurrence de chaque unique de caractères dans la chaîne. Le résultat est livré en paire clé - valeur pour chaque personnage.
JS: