Bonjour,
Existe-t-il une fonction permettant d'avoir le nombre de fois qu'un caractère bien identifié est présent dans une phrase?
Par exemple, dans la phrase : La vie est un fleuve tranquille
Il y a 4 fois la lettre L
Merci
Version imprimable
Bonjour,
Existe-t-il une fonction permettant d'avoir le nombre de fois qu'un caractère bien identifié est présent dans une phrase?
Par exemple, dans la phrase : La vie est un fleuve tranquille
Il y a 4 fois la lettre L
Merci
Code:
1
2
3 function getNumChars(str, char) { return str.match(new RegExp(char,'ig')).length; }
oui ou un poil moins gourmands:
Code:
1
2
3 function getNumChars(str, char) { return str.split(char).length -1 ; }
split accepte une expression régulière en argument, donc :
affiche bien 2 ;)Code:
1
2
3
4 function getNumChars(str, char) { return str.split(char).length -1 ; } alert(getNumChars('Toto', /t/i))
c'était pas spécifié mais ça se règle rapidement:
Code:return str.toLowerCase().split(char.toLowerCase()).length -1 ;}
exactement :)
pendant ce temps, j'ai profité pour faire des tests avec ce code :
résultats :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 function getNumCharsMatchRegExp(str, chr) { return str.match(new RegExp(chr,'ig')).length; } function getNumCharsMatchLowerCase(str, chr) { return str.toLowerCase().match(new RegExp(chr.toLowerCase(),'g')).length; } function getNumCharsSplitRegExp(str, chr) { return str.split(new RegExp(chr,'ig')).length - 1; } function getNumCharsSplitLowerCase(str, chr) { return str.toLowerCase().split(chr.toLowerCase()).length - 1; } window.onload = function() { console.time('createarray'); var str = new Array(1000000).join('i'); console.timeEnd('createarray'); console.time('getNumCharsMatchRegExp'); console.log(getNumCharsMatchRegExp(str, 'i')); console.timeEnd('getNumCharsMatchRegExp'); console.time('getNumCharsMatchLowerCase'); console.log(getNumCharsMatchLowerCase(str, 'i')); console.timeEnd('getNumCharsMatchLowerCase'); console.time('getNumCharsSplitRegExp'); console.log(getNumCharsSplitRegExp(str, 'i')); console.timeEnd('getNumCharsSplitRegExp'); console.time('getNumCharsSplitLowerCase'); console.log(getNumCharsSplitLowerCase(str, 'i')); console.timeEnd('getNumCharsSplitLowerCase'); }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 createarray: 145ms 999999 getNumCharsMatchRegExp: 320ms 999999 getNumCharsMatchLowerCase: 354ms 999999 getNumCharsSplitRegExp: 137ms 999999 getNumCharsSplitLowerCase: 60ms
ce n'est pas si étonnant vu que tu crées à chaque fois une new RegExp
la regexp est créée une seule fois mon coco, regarde bien le code, il prend en paramètres le résultat de new RegExp, mais il est bien connu que les regExp c'est plus lent en traitement que la chose la plus simple comme un split sur caractère simple par exemple.
Tu vois bien que la fonction est appelée UNE SEULE FOIS et elle se prend donc une regexp directement en paramètre et joue avec derrière
Arf en effet je ne sais pas pourquoi je suis aller imaginer que la creation de la reg etait dans une boucle :cfou:
il faudrait tester la solution de de Beef qui a mon avis doit etre intermédiaire niveau perfs