847 Stimmen

Wie zählt man das Vorkommen eines Strings in einem String?

Wie kann ich die Anzahl der Vorkommnisse eines bestimmten Strings in einem anderen String zählen? Zum Beispiel versuche ich dies in Javascript:

var temp = "Das ist ein String.";
alert(temp.count("ist")); //sollte '2' ergeben

23 Stimmen

Es kommt darauf an, ob Sie überlappende Instanzen akzeptieren, z.B. var t = "sss"; Wie viele Instanzen des Teilstrings "ss" befinden sich in dem obigen String? 1 oder 2? Springen Sie über jede Instanz hinweg oder bewegen Sie sich zeichenweise und suchen nach dem Teilstring?

4 Stimmen

Ein verbesserter Benchmark für die Antworten auf diese Frage: jsperf.com/string-ocurrence-split-vs-match/2 (basierend auf dem Benchmark von Kazzkiq).

0 Stimmen

Zählen Sie die Gesamtmenge eines bestimmten Wortes in einem String JavaScript stackoverflow.com/a/65036248/4752258

19voto

Gumbo Punkte 617646

Sie können match verwenden, um eine solche Funktion zu definieren:

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

14voto

Faraz Kelhini Punkte 3797

Die nicht-regex-Version:

 var string = 'Das ist ein String',
    searchFor = 'ist',
    count = 0,
    pos = string.indexOf(searchFor);

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

console.log(count);   // 2

14voto

Tomas Punkte 54613

Nur Code-Golfing Rebecca Chernoff's Lösung :-)

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

12voto

Fad Seck Punkte 111
String.prototype.Count = function (find) {
    return this.split(find).length - 1;
}

console.log("This is a string.".Count("is"));

Dies wird 2 zurückgeben.

7voto

Ismael Miguel Punkte 4021

Hier ist die schnellste Funktion!

Warum ist sie schneller?

  • Überprüft nicht Zeichen für Zeichen (mit 1 Ausnahme)
  • Verwendet eine while-Schleife und inkrementiert eine Variable (die Zeichenanzahl-Variable) im Vergleich zu einer for-Schleife, die die Länge überprüft und 2 Variablen inkrementiert (normalerweise die Variable i und eine Variable mit der Zeichenanzahl)
  • Verwendet VIEL weniger Variablen
  • Verwendet kein Regex!
  • Verwendet eine (hoffentlich) stark optimierte Funktion
  • Alle Operationen sind so kombiniert wie möglich, um Verzögerungen aufgrund mehrerer Operationen zu vermeiden

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

Hier ist eine langsamere und besser lesbare Version:

    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;
    };

Diese ist langsamer wegen des Zählers, langen Variablennamen und der falschen Verwendung einer Variable.

Um sie zu verwenden, tun Sie einfach dies:

    'Das Zeichen "a" kommt nur zweimal vor'.timesCharExist('a');

Bearbeitung: (16. Dezember 2013)

VERWENDE es nicht mit Opera 12.16 oder älter! Es dauert fast 2,5x länger als die Regex-Lösung!

In Chrome dauert diese Lösung zwischen 14ms und 20ms für 1.000.000 Zeichen.

Die Regex-Lösung benötigt 11-14ms für die gleiche Menge.

Die Verwendung einer Funktion (außerhalb von String.prototype) dauert etwa 10-13ms.

Hier ist der verwendete Code:

    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');

Das Ergebnis aller Lösungen sollte 100.000 sein!

Hinweis: Wenn Sie möchten, dass diese Funktion mehr als 1 Zeichen zählt, ändern Sie c=(c+'')[0] in c=c+''

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X