794 Stimmen

Zählt die Anzahl der Vorkommen eines Zeichens in einer Zeichenkette in Javascript

Ich muss die Anzahl der Vorkommen eines Zeichens in einer Zeichenkette zählen.

Nehmen wir zum Beispiel an, meine Zeichenkette enthält:

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

Ich möchte die Anzahl der Kommas ermitteln , Zeichen, also 3, und die Anzahl der einzelnen Zeichenfolgen nach der Trennung durch Komma, also 4.

Außerdem muss ich überprüfen, dass jede der Zeichenketten, d. h. str1 oder str2 oder str3 oder str4, nicht mehr als, sagen wir, 15 Zeichen umfassen sollte.

6voto

Valera Rozuvan Punkte 181

Ich habe herausgefunden, dass der beste Ansatz für die Suche nach einem Zeichen in einer sehr großen Zeichenkette (die zum Beispiel 1 000 000 Zeichen lang ist) die Verwendung der replace() método.

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

Sie können sehen ein weiterer JSPerf Suite, um diese Methode zusammen mit anderen Methoden zum Auffinden eines Zeichens in einer Zeichenkette zu testen.

5voto

Clive Paterson Punkte 1543

Leistung von Split gegenüber RegExp

var i = 0;

var split_start = new Date().getTime();
while (i < 30000) {
  "1234,453,123,324".split(",").length -1;
  i++;
}
var split_end = new Date().getTime();
var split_time = split_end - split_start;

i= 0;
var reg_start = new Date().getTime();
while (i < 30000) {
  ("1234,453,123,324".match(/,/g) || []).length;
  i++;
}
var reg_end = new Date().getTime();
var reg_time = reg_end - reg_start;

alert ('Split Execution time: ' + split_time + "\n" + 'RegExp Execution time: ' + reg_time + "\n");

4voto

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

4voto

Ankur Choraywal Punkte 152

Der einfachste Weg, den ich herausgefunden habe...

Beispiel -

str = 'mississippi';

function find_occurences(str, char_to_count){
    return str.split(char_to_count).length - 1;
}

find_occurences(str, 'i') //outputs 4

4voto

NuSkooler Punkte 5263

Ich habe gerade einen sehr schnellen und schmutzigen Test auf repl.it unter Verwendung von Node v7.4. Für ein einzelnes Zeichen ist die standardmäßige for-Schleife am schnellsten:

Einige Codes :

// winner!
function charCount1(s, c) {
    let count = 0;
    c = c.charAt(0); // we save some time here
    for(let i = 0; i < s.length; ++i) {
        if(c === s.charAt(i)) {
            ++count;
        }
    }
    return count;
}

function charCount2(s, c) {
    return (s.match(new RegExp(c[0], 'g')) || []).length;
}

function charCount3(s, c) {
    let count = 0;
    for(ch of s) {
        if(c === ch) {
            ++count;
        }
    }
    return count;
}

function perfIt() {
    const s = 'Hello, World!';
    const c = 'o';

    console.time('charCount1');
    for(let i = 0; i < 10000; i++) {
        charCount1(s, c);
    }
    console.timeEnd('charCount1');

    console.time('charCount2');
    for(let i = 0; i < 10000; i++) {
        charCount2(s, c);
    }
    console.timeEnd('charCount2');

    console.time('charCount3');
    for(let i = 0; i < 10000; i++) {
        charCount2(s, c);
    }
    console.timeEnd('charCount3');
}

Ergebnisse aus einigen Läufen :

perfIt()
charCount1: 3.301ms
charCount2: 11.652ms
charCount3: 174.043ms
undefined

perfIt()
charCount1: 2.110ms
charCount2: 11.931ms
charCount3: 177.743ms
undefined

perfIt()
charCount1: 2.074ms
charCount2: 11.738ms
charCount3: 152.611ms
undefined

perfIt()
charCount1: 2.076ms
charCount2: 11.685ms
charCount3: 154.757ms
undefined

Aktualisierung 2021-Feb-10 : Tippfehler in der repl.it-Demo behoben

Update 2020-Okt-24 : Das ist bei Node.js 12 immer noch der Fall (hier können Sie es selbst ausprobieren)

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