Question Comment compter les occurrences de chaînes dans une chaîne?


Comment puis-je compter le nombre de fois qu'une chaîne particulière se produit dans une autre chaîne. Par exemple, c'est ce que j'essaie de faire en Javascript:

var temp = "This is a string.";
alert(temp.count("is")); //should output '2'

426
2017-10-24 18:39


origine


Réponses:


le g dans l'expression régulière (abréviation de global) dit de rechercher toute la chaîne plutôt que de simplement trouver la première occurrence:

var temp = "This is a string.";
var count = (temp.match(/is/g) || []).length;
console.log(count);

Cela correspond is deux fois. Et s'il n'y a pas de correspondances, il retourne 0.

var temp = "Hello World!";
var count = (temp.match(/is/g) || []).length;
console.log(count);


741
2017-10-24 18:42



/** Function that count occurrences of a substring in a string;
 * @param {String} string               The string
 * @param {String} subString            The sub string to search for
 * @param {Boolean} [allowOverlapping]  Optional. (Default:false)
 *
 * @author Vitim.us https://gist.github.com/victornpb/7736865
 * @see Unit Test https://jsfiddle.net/Victornpb/5axuh96u/
 * @see http://stackoverflow.com/questions/4009756/how-to-count-string-occurrence-in-string/7924240#7924240
 */
function occurrences(string, subString, allowOverlapping) {

    string += "";
    subString += "";
    if (subString.length <= 0) return (string.length + 1);

    var n = 0,
        pos = 0,
        step = allowOverlapping ? 1 : subString.length;

    while (true) {
        pos = string.indexOf(subString, pos);
        if (pos >= 0) {
            ++n;
            pos += step;
        } else break;
    }
    return n;
}

Usage

occurrences("foofoofoo", "bar"); //0

occurrences("foofoofoo", "foo"); //3

occurrences("foofoofoo", "foofoo"); //1

PermettreOverlapping

occurrences("foofoofoo", "foofoo", true); //2

Allumettes:

  foofoofoo
1 `----´
2    `----´

Test de l'unité

Référence

J'ai fait un test de benchmark et ma fonction est plus de 10 fois   plus rapide que la fonction de correspondance regexp publiée par gumbo. Dans mon test   La chaîne a une longueur de 25 caractères. avec 2 occurrences du caractère 'o'. je   exécuté 1 000 000 fois dans Safari.

Safari 5.1

Benchmark> Exécution du temps total: 5617 ms (regexp)

Benchmark> Exécution du temps total: 881 ms (ma fonction 6.4x plus rapide)

Firefox 4

Indicateur de référence> Durée d'exécution totale: 8547 ms (Rexexp)

Benchmark> Exécution du temps total: 634 ms (ma fonction 13.5x plus rapide)


Edit: changements que j'ai faits

  • longueur de sous-chaîne mise en cache

  • ajout de la frappe de caractères à la chaîne.

  • ajout du paramètre facultatif 'allowOverlapping'

  • sortie correcte corrigée pour "" cas de sous-chaîne vide.

Essentiel

188
2017-10-28 01:27



function countInstances(string, word) {
   return string.split(word).length - 1;
}

67
2017-10-24 18:43



Vous pouvez essayer ceci:

var theString = "This is a string.";
console.log(theString.split("is").length - 1);


59
2018-02-24 17:30



Ma solution:

var temp = "This is a string.";

function countOcurrences(str, value) {
  var regExp = new RegExp(value, "gi");
  return (str.match(regExp) || []).length;
}

console.log(countOcurrences(temp, 'is'));


25
2018-04-09 01:20



Vous pouvez utiliser match pour définir une telle fonction:

String.prototype.count = function(search) {
    var m = this.match(new RegExp(search.toString().replace(/(?=[.\\+*?[^\]$(){}\|])/g, "\\"), "g"));
    return m ? m.length:0;
}

17
2017-10-24 18:45



Voici la fonction la plus rapide!

Pourquoi est-ce plus rapide?

  • Ne coche pas le caractère par un caractère (avec une exception)
  • Utilise un while et incrémente 1 var (le char count var) par rapport à une boucle for en vérifiant la longueur et en incrémentant 2 vars (en général var i et a var avec le nombre de char)
  • Utilise WAY moins de vars
  • N'utilise pas regex!
  • Utilise une fonction (optimisée) hautement optimisée
  • Toutes les opérations sont aussi combinées que possible, évitant les ralentissements dus à de multiples opérations

    String.prototype.timesCharExist=function(c){var t=0,l=0,c=(c+'')[0];while(l=this.indexOf(c,l)+1)++t;return t};
    

Voici une version plus lente et plus lisible:

    String.prototype.timesCharExist = function ( chr ) {
        var total = 0, last_location = 0, single_char = ( chr + '' )[0];
        while( last_location = this.indexOf( single_char, last_location ) + 1 )
        {
            total = total + 1;
        }
        return total;
    };

Celui-ci est plus lent à cause du compteur, des noms de var longs et de l'utilisation abusive de 1 var.

Pour l'utiliser, il vous suffit de faire ceci:

    'The char "a" only shows up twice'.timesCharExist('a');

Edit: (2013/12/16)

NE PAS utiliser avec Opera 12.16 ou plus ancien! il faudra 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 regex prend 11-14ms pour la même quantité.

Utiliser une fonction (à l'extérieur String.prototype) prendra environ 10-13ms.

Voici le code utilisé:

    String.prototype.timesCharExist=function(c){var t=0,l=0,c=(c+'')[0];while(l=this.indexOf(c,l)+1)++t;return t};

    var x=Array(100001).join('1234567890');

    console.time('proto');x.timesCharExist('1');console.timeEnd('proto');

    console.time('regex');x.match(/1/g).length;console.timeEnd('regex');

    var timesCharExist=function(x,c){var t=0,l=0,c=(c+'')[0];while(l=x.indexOf(c,l)+1)++t;return t;};

    console.time('func');timesCharExist(x,'1');console.timeEnd('func');

Le résultat de toutes les solutions devrait être de 100 000!

Remarque: si vous souhaitez que cette fonction compte plus de 1 caractère, modifiez où c=(c+'')[0] dans c=c+''


7
2017-08-29 15:40



La version non-regex:

 var string = 'This is a string',
    searchFor = 'is',
    count = 0,
    pos = string.indexOf(searchFor);

while (pos > -1) {
    ++count;
    pos = string.indexOf(searchFor, ++pos);
}

console.log(count);   // 2


7
2018-03-15 08:21



Juste le code-golf Rebecca Chernoffde Solution :-)

alert(("This is a string.".match(/is/g) || []).length);

7
2017-08-13 18:16



var temp = "This is a string.";
console.log((temp.match(new RegExp("is", "g")) || []).length);


5
2017-11-18 12:56