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
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
Hier ist die schnellste Funktion!
Warum ist sie schneller?
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+''
Ein einfacher Weg wäre, den String an dem erforderlichen Wort zu trennen, dem Wort, für das wir die Anzahl der Vorkommen berechnen möchten, und 1 von der Anzahl der Teile abzuziehen:
function checkOccurences(string, word) {
return string.split(word).length - 1;
}
const text="Lass uns sehen. siehe oben, siehe unten, siehe vorwärts, siehe rückwärts, siehe links, siehe rechts, bis wir richtig sind";
const count=countOccurences(text,"siehe "); // 2
Ich denke, der Zweck für Regex ist sehr unterschiedlich von indexOf
. indexOf
findet einfach das Vorkommen eines bestimmten Strings, während Sie in Regex Platzhalter wie [A-Z]
verwenden können, was bedeutet, dass es jedes Großbuchstaben im Wort ohne Angabe des tatsächlichen Buchstabens finden wird.
Beispiel:
var index = "Das ist ein String".indexOf("is");
console.log(index);
var length = "Das ist ein String".match(/[a-z]/g).length;
// where [a-z] is a regex wildcard expression thats why its slower
console.log(length);
Basierend auf der Antwort von @Vittim.us oben. Mir gefällt die Kontrolle, die seine Methode mir gibt, weil es einfach ist, sie zu erweitern, aber ich musste die Groß-/Kleinschreibung hinzufügen und Übereinstimmungen auf ganze Wörter mit Unterstützung für Interpunktion begrenzen. (z. B. "Bad" ist in "ein Bad nehmen.", aber nicht "Baden")
Der Interpunktionsregex stammt von: https://stackoverflow.com/a/25575009/497745 (Wie kann ich mit Regex alle Interpunktionen aus einem String in JavaScript entfernen?)
function keywordOccurrences(string, subString, allowOverlapping, caseInsensitive, wholeWord)
{
string += "";
subString += "";
if (subString.length <= 0) return (string.length + 1); //deal with empty strings
if(caseInsensitive)
{
string = string.toLowerCase();
subString = subString.toLowerCase();
}
var n = 0,
pos = 0,
step = allowOverlapping ? 1 : subString.length,
stringLength = string.length,
subStringLength = subString.length;
while (true)
{
pos = string.indexOf(subString, pos);
if (pos >= 0)
{
var matchPos = pos;
pos += step; //slide forward the position pointer no matter what
if(wholeWord) //only whole word matches are desired
{
if(matchPos > 0) //if the string is not at the very beginning we need to check if the previous character is whitespace
{
if(!/[\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&\(\)*+,\-.\/:;<=>?@\[\]^_`{|}~]/.test(string[matchPos - 1])) //ignore punctuation
{
continue; //then this is not a match
}
}
var matchEnd = matchPos + subStringLength;
if(matchEnd < stringLength - 1)
{
if (!/[\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&\(\)*+,\-.\/:;<=>?@\[\]^_`{|}~]/.test(string[matchEnd])) //ignore punctuation
{
continue; //then this is not a match
}
}
}
++n;
} else break;
}
return n;
}
Bitte zögern Sie nicht, diese Antwort zu bearbeiten und zu verbessern, wenn Sie Fehler oder Verbesserungsmöglichkeiten finden.
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.
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
0 Stimmen
Dieses Video scheint hier vage verwandt zu sein - "Google Coding Interview With A Facebook Software Engineer" - youtube.com/watch?v=PIeiiceWe_w