726 votes

Compter le nombre d'occurrences d'un caractère dans une chaîne de caractères en Javascript

Tout d'abord, je suis novice en matière de Javascript.

Je dois compter le nombre d'occurrences d'un caractère dans une chaîne de caractères.

Par exemple, supposons que ma chaîne de caractères contienne :

var mainStr = "str1,str2,str3,str4";

Je veux trouver le nombre de virgules , Et le nombre de chaînes individuelles après la virgule de séparation, qui est de 4.

Je dois également valider que chacune des chaînes, c'est-à-dire str1 ou str2 ou str3 ou str4, ne doit pas dépasser, disons, 15 caractères.

Quelqu'un peut-il m'aider ?

1006voto

Bjorn Tipling Points 16243

Si tu cherches les virgules :

(mainStr.split(",").length - 1) //3

Si vous cherchez le str

(mainStr.split("str").length - 1) //4

9 votes

Le test montre que Firefox est beaucoup plus rapide que tout autre navigateur lors du fractionnement. jsperf.com/compte-le-nombre-d'occurrences-dans-la-chaîne

0 votes

Chrome 33 au moins sur Windows 7 x64 bat Firefox 27 en fractionnement mais pas en expression régulière. 2/25/2014

1 votes

Cela va être beaucoup plus lent que le regex.

280voto

Lo Sauer Points 5469

Il y a au moins quatre façons de procéder. La meilleure option, qui devrait également être la plus rapide - grâce au moteur RegEx natif -, est placée en haut. jsperf.com est actuellement hors service, sinon je vous fournirais des statistiques de performance.

Mise à jour : Veuillez trouver les tests de performance ici et les exécuter vous-mêmes, afin de contribuer aux résultats de vos performances. Les détails des résultats seront donnés plus tard.

1.

 ("this is foo bar".match(/o/g)||[]).length
 //>2

2.

"this is foo bar".split("o").length-1
 //>2

fractionnement non recommandé. Avide de ressources. Alloue de nouvelles instances de 'Array' pour chaque correspondance. N'essayez pas cela pour un fichier de plus de 100 Mo via FileReader. Vous pouvez facilement observer l'utilisation EXACTE des ressources en utilisant Le profileur de Chrome option.

3.

var stringsearch = "o"
   ,str = "this is foo bar";
for(var count=-1,index=-2; index != -1; count++,index=str.indexOf(stringsearch,index+1) );
 //>count:2

4.

recherche d'un seul caractère

var stringsearch = "o"
   ,str = "this is foo bar";
for(var i=count=0; i<str.length; count+=+(stringsearch===str[i++]));
 //>count:2

Mise à jour :

5.

mappage et filtrage des éléments, non recommandé en raison de la préaffectation globale des ressources plutôt que de l'utilisation de "générateurs" pythoniens.

var str = "this is foo bar"
str.split('').map( function(e,i){ if(e === 'o') return i;} )
             .filter(Boolean)
//>[9, 10]
[9, 10].length
//>2

Partager : J'ai fait ça Gist avec actuellement 8 méthodes de comptage de caractères, afin que nous puissions directement mettre en commun et partager nos idées - juste pour le plaisir, et peut-être quelques points de repère intéressants :)

https://gist.github.com/2757250

33 votes

Il m'a fallu un peu de temps pour réaliser ce que ||[] que je faisais, mais cette réponse est géniale ! Pour tous ceux qui se grattent la tête, match() renvoie à null si aucune correspondance n'est trouvée et ||[] retournera un tableau de longueur 0 si le match() renvoie à null c'est-à-dire length() retournera 0 au lieu de produire une erreur de type.

1 votes

Nathan, pour ma défense, j'ai élaboré sur ce point avant d'écrire le code ci-dessus : gist.github.com/2757164 . Je veux éviter les articles de blog contenant de petits morceaux de code, qui vous auraient pourtant permis un accès instantané via Google. Gist, en tant que dépôt de snippets, est très faiblement indexé et n'est pas idéal. PS : Moi aussi je déteste les idiosyncrasies syntaxiques peu claires.

2 votes

Lo Sauer, pas besoin de se défendre, le code est solide et j'ai appris quelque chose par moi-même en découvrant son fonctionnement :) Je préfère cette méthode à ce qui est marqué comme étant la réponse. Il ne devrait pas y avoir besoin de diviser une chaîne de caractères si on ne va pas utiliser les résultats.

13voto

immibis Points 5859

Un rapide Google La recherche a obtenu ceci (de http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript )

String.prototype.count=function(s1) { 
    return (this.length - this.replace(new RegExp(s1,"g"), '').length) / s1.length;
}

Utilisez-le comme ça :

test = 'one,two,three,four'
commas = test.count(',') // returns 3

5 votes

Erreur sur * char ( SyntaxError: nothing to repeat )

1 votes

L'argument doit être une expression régulière. Ainsi, si vous voulez compter vous devez envoyer '[*]. ]'

6voto

Valera Rozuvan Points 1

J'ai constaté que la meilleure approche pour rechercher un caractère dans une très grande chaîne de caractères (qui compte 1 000 000 de caractères, par exemple) consiste à utiliser la fonction replace() méthode.

window.count_replace = function (str, schar) {
    return str.length - str.replace(RegExp(schar), '').length;
};

Vous pouvez voir encore un autre JSPerf pour tester cette méthode ainsi que d'autres méthodes de recherche d'un caractère dans une chaîne.

0 votes

Il est évident que si votre code itère d'une manière ou d'une autre sur un million de caractères 500 000 fois par seconde, mon processeur tourne à au moins 100 GHz (en supposant qu'il n'y ait pas de SIMD ; même dans ce cas, ce serait au moins 40 GHz). Je ne pense donc pas que ce benchmark soit correct.

3voto

wlf Points 163
s = 'dir/dir/dir/dir/'
for(i=l=0;i<s.length;i++)
if(s[i] == '/')
l++

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X