Wie zählt das Auftreten von Zeichenfolgen in Zeichenfolgen?

608

Wie kann ich zählen, wie oft eine bestimmte Zeichenfolge in einer anderen Zeichenfolge vorkommt? Zum Beispiel versuche ich Folgendes in Javascript zu tun:

var temp = "This is a string.";
alert(temp.count("is")); //should output '2'
TruMan1
quelle
19
Dies hängt davon ab, ob Sie überlappende Instanzen akzeptieren , z. B. var t = "sss". Wie viele Instanzen des Teilstrings "ss" befinden sich in der obigen Zeichenfolge? 1 oder 2? Springen Sie über jede Instanz oder bewegen Sie den Zeiger zeichenweise, um nach der Teilzeichenfolge zu suchen?
Tim
4
Ein verbesserter Benchmark für die Antworten dieser Frage: jsperf.com/string-ocurrence-split-vs-match/2 (basierend auf dem Benchmark von Kazzkiq).
idmean

Antworten:

1028

Der greguläre Ausdruck (kurz für global ) besagt, dass die gesamte Zeichenfolge durchsucht werden soll, anstatt nur das erste Vorkommen zu finden. Das passt iszweimal zusammen:

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

Und wenn es keine Übereinstimmungen gibt, wird Folgendes zurückgegeben 0:

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

Rebecca Chernoff
quelle
3
modern und elegant, aber die Lösung von Vitimtk ist viel effizienter. Was haltet ihr alle von seinem Code?
TruMan1
5
Dies beantwortet die Frage am besten. Wenn jemand fragen würde "Wie kann ich das in besonderen Fällen 10x schneller machen (ohne reguläre Ausdrücke)", würde Vitimtk diese Frage gewinnen.
Dzhaughn
121
Danke dafür. Ich habe mich count = (str.match(/is/g) || []).lengthdarum gekümmert, wenn du kein Match hast.
Matt
6
Ich denke nicht, dass diese Antwort richtig mit der Frage übereinstimmt, da keine Zeichenfolge als Argument für die Übereinstimmung erforderlich ist, wie im Anwendungsfall beschrieben. Natürlich können Sie den regulären Ausdruck dynamisch mithilfe des RegExpKonstruktors erstellen und die gesuchte Zeichenfolge übergeben, aber in diesem Fall müssen Sie alle Metazeichen maskieren. In diesem Szenario ist ein reiner String-Ansatz vorzuziehen.
ZER0
3
Matts Antwort sollte in der Antwort sein!
Senči
240
/** 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;
}

Verwendungszweck

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

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

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

allowOverlapping

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

Streichhölzer:

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

Gerätetest

Benchmark

Ich habe einen Benchmark-Test durchgeführt und meine Funktion ist mehr als zehnmal schneller als die von gumbo veröffentlichte Regexp-Match-Funktion. In meinem Teststring ist 25 Zeichen lang. mit 2 Vorkommen des Zeichens 'o'. Ich habe 1 000 000 Mal in Safari ausgeführt.

Safari 5.1

Benchmark> Gesamtzeitausführung: 5617 ms (regulärer Ausdruck)

Benchmark> Gesamtzeitausführung: 881 ms (meine Funktion 6,4x schneller)

Firefox 4

Benchmark> Gesamtzeitausführung: 8547 ms (Rexexp)

Benchmark> Gesamtzeitausführung: 634 ms (meine Funktion 13,5x schneller)


Bearbeiten: Änderungen, die ich vorgenommen habe

  • Länge des zwischengespeicherten Teilstrings

  • Typ-Casting zum String hinzugefügt.

  • optionaler Parameter 'allowOverlapping' hinzugefügt

  • Die korrekte Ausgabe für den leeren Teilstring-Fall wurde behoben.

Kern
Vitim.us
quelle
5
Ich habe diesen Test in Safari 5 wiederholt und ähnliche Ergebnisse mit einer kleinen (100b) Zeichenfolge erzielt, aber mit einer größeren Zeichenfolge (16kb) lief der reguläre Ausdruck für mich schneller. Für eine Iteration (nicht 1.000.000) betrug der Unterschied ohnehin weniger als eine Millisekunde, daher geht meine Stimme an den regulären Ausdruck.
Arlomedia
2
+1, aber Sie überprüfen substring.lengthfast jede Schleife, sollten Sie in Betracht ziehen, sie außerhalb derwhile
ajax333221
1
@ Ajax333221 OMG Sie haben meine Gedanken gelesen, ich habe diese Verbesserung vor ein paar Tagen gemacht, und ich wollte meine Antwort jsperf.com/count-string-occurrence-in-string
Vitim.us
4
Ich habe Ihren Code hier gefunden: success-equation.com/mind_reader.html . Wirklich nett, dass der Programmierer darauf bedacht war, dort eine Referenz zu setzen.
Bruno Kim
3
@DanielZuzevich es wird die Typen zu String zwingen , falls Sie dies tun occurrences(11,1) //2und es würde immer noch funktionieren. (Es ist schneller auf diese Weise, anstatt nach Typen zu
suchen
112
function countInstances(string, word) {
   return string.split(word).length - 1;
}
Orbit
quelle
4
Dies ist ein unsicherer / ungenauer Ansatz, zum Beispiel : countInstances("isisisisisis", "is") === 0.
Nick Craver
5
@Antal - Sieht aus wie ein Fehler in der vorherigen Beta-Version von Chrome, funktioniert nach dem Update auf den neuesten Stand. Ich würde mich jedoch immer noch von dieser Methode fernhalten.
Nick Craver
28
Dies scheint mir eine absolut gültige Lösung zu sein.
Gregor Schmidt
2
@NickCraver aus Neugier, warum willst du dich von dieser Methode fernhalten? (außer Fehler in Ihrem Beta-Browser)
Jonny Lin
6
@JonnyLin Es werden unnötige Zuordnungen erstellt, die Sie sofort wegwerfen, wenn Alternativen dies nicht tun - möglicherweise sehr große, abhängig von den Daten.
Nick Craver
88

Sie können dies versuchen:

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

Freezy Ize
quelle
14
+1 für die Einfachheit und weil entsprechend meinen Tests diese Lösung ~ 10x schneller läuft als die anderen!
Claudio Holanda
Zum Beispiel habe ich zwei "ist", wie bekommt man die Position von jedem?
Rapidoodle
Wie in der Antwort von @Orbit erläutert, erzielen Benutzer bei älteren Chrome-Versionen unterschiedliche Ergebnisse. Ich wäre mit dieser Methode vielleicht etwas vorsichtig.
mgthomas99
Und Sie können es auch mit Variablen verwenden: theString.split(myvar).length - 1die Sie mit einfachen Regex nicht können
Steffan
4
Dies ist @Orbits Antwort drei Jahre später ...
Aloisdg wechselt zu codidact.com
33

Meine Lösung:

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

Gere
quelle
5
Vielleicht wäre es besser, (str.match (regExp) || []) zurückzugeben. length; Auf diese Weise bewerten Sie den regulären Ausdruck nicht zweimal?
Aikeru
2
Sie müssen auch Ihre Schnur scape oder countOcurrences('Hello...','.')==8und nicht 3
Vitim.us
19

Sie können verwenden match, 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;
}
Gumbo
quelle
1
Wenn Sie möchten, dass es mit der Suchsemantik von JS einheitlich ist, wäre die Rückgabezeile return m ? m.length:-1;.
Conor O'Brien
Dies ist besser als die anderen oben genannten Regex-Lösungen, da sie einen Fehler verursachen, wenn die Zeichenfolge zum Zählen der Vorkommen von "[" oder etwas mit einer besonderen Bedeutung in Regex ist.
Programmierer5000
11

Die Nicht-Regex-Version:

 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

Faraz Kelhini
quelle
1. Es ist nur für die Suche nach einzelnen is
Zeichen
1
Dies ist wahrscheinlich die schnellste Implementierung hier, aber es wäre noch schneller, wenn Sie "++ pos" durch "pos + = searchFor.length"
ersetzen würden
10

Nur Code-Golf Rebecca Chernoff ‚s Lösung :-)

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

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

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

Dies wird 2 zurückgeben.

Modeerscheinung Seck
quelle
3
Dies ist @Orbits Antwort sechs Jahre später ...
Aloisdg wechselt zu codidact.com
8

Hier ist die schnellste Funktion!

Warum ist es schneller?

  • Überprüft nicht char für char (mit 1 Ausnahme)
  • Verwendet eine Weile und erhöht 1 var (die Zeichenanzahl var) gegenüber einer for-Schleife, die die Länge überprüft und 2 vars erhöht (normalerweise var i und eine var mit der Zeichenanzahl).
  • Verwendet viel weniger Vars
  • Verwendet keinen regulären Ausdruck!
  • Verwendet eine (hoffentlich) hochoptimierte Funktion
  • Alle Vorgänge sind so kombiniert wie möglich, um Verlangsamungen aufgrund mehrerer Vorgänge 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;
    };

Dieser ist langsamer wegen des Zählers, der langen Variablennamen und des Missbrauchs von 1 Var.

Um es zu benutzen, machen Sie einfach folgendes:

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

Bearbeiten: (16.12.2013)

NICHT mit Opera 12.16 oder älter verwenden! Es dauert fast 2,5x mehr als die Regex-Lösung!

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

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

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

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 diese Funktion mehr als 1 Zeichen zählen soll, ändern Sie die Position c=(c+'')[0]inc=c+''

Ismael Miguel
quelle
1
Der Prototyp war ein Beispiel! Sie können die Funktion nach Belieben nutzen! Sie können dies sogar tun: var timesFunctionExist = Funktion (x, c) {var t = 0, l = 0, c = (c + '') [0]; während (l = x.indexOf (c, l) +1 ) ++ t; return t}); alert (timesCharExist ('Das Zeichen "a" wird nur zweimal angezeigt', 'a'));! (Dies wird etwas schneller, weil ich nicht mit Prototypen herumspielen werde). Wenn du denkst, ich liege falsch, warum zeigst du es nicht, bevor du Steine ​​auf mich wirfst? Beweise mir, dass meine Funktion scheiße ist und ich sie akzeptieren werde. Zeigen Sie mir einen Testfall. Und die Länge der Vars hat Einfluss auf die Geschwindigkeit. Sie können es testen.
Ismael Miguel
7

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

Sunil Garg
quelle
4

Ich denke, der Zweck von Regex unterscheidet sich stark von indexOf. indexOfFinden Sie einfach das Vorkommen einer bestimmten Zeichenfolge, während Sie in Regex Platzhalter verwenden können, [A-Z]was bedeutet, dass jedes Großbuchstaben im Wort gefunden wird, ohne das tatsächliche Zeichen anzugeben .

Beispiel:

 var index = "This is a string".indexOf("is");
 console.log(index);
 var length = "This is a string".match(/[a-z]/g).length;
 // where [a-z] is a regex wildcard expression thats why its slower
 console.log(length);

Simm
quelle
3

Super duper alt, aber ich musste heute so etwas machen und dachte nur daran, SO danach zu überprüfen. Funktioniert ziemlich schnell für mich.

String.prototype.count = function(substr,start,overlap) {
    overlap = overlap || false;
    start = start || 0;

    var count = 0, 
        offset = overlap ? 1 : substr.length;

    while((start = this.indexOf(substr, start) + offset) !== (offset - 1))
        ++count;
    return count;
};
Jason Larke
quelle
3
       var myString = "This is a string.";
        var foundAtPosition = 0;
        var Count = 0;
        while (foundAtPosition != -1)
        {
            foundAtPosition = myString.indexOf("is",foundAtPosition);
            if (foundAtPosition != -1)
            {
                Count++;
                foundAtPosition++;
            }
        }
        document.write("There are " + Count + " occurrences of the word IS");

Siehe: - Zählen Sie einen Teilstring, der in der Zeichenfolge angezeigt wird, um eine schrittweise Erklärung zu erhalten.

Ranju
quelle
3

Aufbauend auf der obigen Antwort von @ Vittim.us. Ich mag die Kontrolle, die mir seine Methode gibt und die es einfach macht, sie zu erweitern, aber ich musste Groß- und Kleinschreibung nicht berücksichtigen und Übereinstimmungen auf ganze Wörter beschränken, um die Interpunktion zu unterstützen. (zB "Bad" ist in "Bad nehmen", aber nicht "Baden")

Der reguläre Satzzeichen für Interpunktion stammt von: https://stackoverflow.com/a/25575009/497745 ( Wie kann ich mit Regex alle Satzzeichen 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 ändern und umzugestalten, wenn Sie Fehler oder Verbesserungen entdecken.

Ayo ich
quelle
3

Beachten Sie für alle, die diesen Thread in Zukunft finden, dass die akzeptierte Antwort nicht immer den richtigen Wert zurückgibt, wenn Sie ihn verallgemeinern, da er Regex-Operatoren wie $und erstickt .. Hier ist eine bessere Version, die mit jeder Nadel umgehen kann :

function occurrences (haystack, needle) {
  var _needle = needle
    .replace(/\[/g, '\\[')
    .replace(/\]/g, '\\]')
  return (
    haystack.match(new RegExp('[' + _needle + ']', 'g')) || []
  ).length
}
Bcherny
quelle
3

function get_occurrence(varS,string){//Find All Occurrences
        c=(string.split(varS).length - 1);
        return c;
    }
    temp="This is a string.";
    console.log("Total Occurrence is "+get_occurrence("is",temp));

Verwenden Sie get_occurrence (varS, string), um das Auftreten von Zeichen und Zeichenfolgen in einer Zeichenfolge zu ermitteln.

Rahul Ranjan
quelle
2

Versuch es

<?php 
$str = "33,33,56,89,56,56";
echo substr_count($str, '56');
?>

<script type="text/javascript">
var temp = "33,33,56,89,56,56";
var count = temp.match(/56/g);  
alert(count.length);
</script>
Meghendra S Yadav
quelle
2

Einfache Version ohne Regex:

var temp = "This is a string.";

var count = (temp.split('is').length - 1);

alert(count);

Jorge Alberto
quelle
3
Dies ist @Orbits Antwort sechs Jahre später ...
Aloisdg wechselt zu codidact.com
2

Niemand wird das jemals sehen, aber es ist gut, ab und zu Rekursions- und Pfeilfunktionen zurückzubringen (Wortspiel herrlich beabsichtigt)

String.prototype.occurrencesOf = function(s, i) {
 return (n => (n === -1) ? 0 : 1 + this.occurrencesOf(s, n + 1))(this.indexOf(s, (i || 0)));
};
BaseZen
quelle
2

Versuche dies

let allData =  "This is a string.";
let searchString = 'is';
let regularExp = new RegExp(searchString, 'g');
let occurArray = allData.match(regularExp);
let count = (occurArray || []).length;
alert(count); 

Fiddle Link: https://jsfiddle.net/rajaramtt/gn0dtsjc/1/

Raja Rama Mohan Thavalam
quelle
1

Dies ist ein sehr alter Thread, auf den ich gestoßen bin, aber da viele ihre Antworten gepusht haben, ist hier meiner in der Hoffnung, jemandem mit diesem einfachen Code zu helfen.

var search_value = "This is a dummy sentence!";
var letter = 'a'; /*Can take any letter, have put in a var if anyone wants to use this variable dynamically*/
letter = letter && "string" === typeof letter ? letter : "";
var count;
for (var i = count = 0; i < search_value.length; count += (search_value[i++] == letter));
console.log(count);

Ich bin mir nicht sicher, ob es die schnellste Lösung ist, aber ich habe es der Einfachheit halber und weil ich keinen regulären Ausdruck verwende (ich mag es einfach nicht, sie zu verwenden!).

Tushar Shukla
quelle
1

Diese Funktion gibt die Anzahl der Vorkommen eines Wortes im Text zurück.

Beachten Sie, dass wir toLowerCase verwenden, um die Anzahl der Vorkommen unabhängig vom Format (Groß- und Kleinschreibung ...) des Wortes und des Textes zu berechnen

wordCount(text, word) {
    if (!text || !word) {
      return 0;
    }
    text = text.toLowerCase();
    word = word.toLowerCase();
    return ( text.split( word ).length - 1 );
}
Asakkour Soufiane
quelle
0

Antwort für Leandro Batista: Nur ein Problem mit dem regulären Ausdruck.

 "use strict";
 var dataFromDB = "testal";
 
  $('input[name="tbInput"]').on("change",function(){
	var charToTest = $(this).val();
	var howManyChars = charToTest.length;
	var nrMatches = 0;
	if(howManyChars !== 0){
		charToTest = charToTest.charAt(0);
		var regexp = new RegExp(charToTest,'gi');
		var arrMatches = dataFromDB.match(regexp);
		nrMatches = arrMatches ? arrMatches.length : 0;
	}
		$('#result').html(nrMatches.toString());

  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="main">
What do you wanna count <input type="text" name="tbInput" value=""><br />
Number of occurences = <span id="result">0</span>
</div>

PhilMaGeo
quelle
0

var countInstances = function(body, target) {
  var globalcounter = 0;
  var concatstring  = '';
  for(var i=0,j=target.length;i<body.length;i++){
    concatstring = body.substring(i-1,j);
    
    if(concatstring === target){
       globalcounter += 1;
       concatstring = '';
    }
  }
  
  
  return globalcounter;
 
};

console.log(   countInstances('abcabc', 'abc')   ); // ==> 2
console.log(   countInstances('ababa', 'aba')   ); // ==> 2
console.log(   countInstances('aaabbb', 'ab')   ); // ==> 1

Kamal
quelle
0

Ein bisschen spät, aber vorausgesetzt, wir haben die folgende Zeichenfolge:

var temp = "This is a string.";

Zuerst teilen wir uns auf, was auch immer Sie suchen, dies wird eine Reihe von Zeichenfolgen zurückgeben.

var array = temp.split("is");

Dann erhalten wir die Länge und subtrahieren 1 davon, da split standardmäßig ein Array der Größe 1 verwendet und folglich seine Größe jedes Mal erhöht, wenn es ein Vorkommen findet.

var occurrenceCount = array.length - 1;
alert(occurrenceCount); //should output '2'

Sie können dies auch in einer Zeile wie folgt tun:

alert("This is a string.".split("is").length - 1); //should output '2'

Hoffe es hilft: D.

Juan Enrique Segebre
quelle
1
Kann ich dies als doppelte Antwort markieren? Vielleicht sollten Sie alle Antworten lesen, bevor Sie Ihre eigenen angeben?
Michiel
2
Dies ist @Orbits Antwort acht Jahre später ...
Aloisdg wechselt zu codidact.com
1
Soll ich diese Antwort dann löschen?
Juan Enrique Segebre
0

Diese Lösung basiert auf der .replace()Methode, die eine RegEx als ersten Parameter und eine Funktion als zweiten Parameter akzeptiert , die wir als Abschluss zum Inkrementieren eines Zählers verwenden können ...

/**
 * Return the frequency of a substring in a string
 * @param {string} string - The string.
 * @param {string} string - The substring to count.
 * @returns {number} number - The frequency.
 * 
 * @author Drozerah https://gist.github.com/Drozerah/2b8e08d28413d66c3e63d7fce80994ce
 * @see https://stackoverflow.com/a/55670859/9370788
 */
const subStringCounter = (string, subString) => {

    let count = 0
    string.replace(new RegExp(subString, 'gi'), () => count++)
    return count
}

Verwendungszweck

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

subStringCounter("foofoofoo", "foo"); //3
Drozerah
quelle
0

bin auf diesen Beitrag gestoßen.

let str = 'As sly as a fox, as strong as an ox';

let target = 'as'; // let's look for it

let pos = 0;
while (true) {
  let foundPos = str.indexOf(target, pos);
  if (foundPos == -1) break;

  alert( `Found at ${foundPos}` );
  pos = foundPos + 1; // continue the search from the next position
}

Der gleiche Algorithmus kann kürzer angelegt werden:

let str = "As sly as a fox, as strong as an ox";
let target = "as";

let pos = -1;
while ((pos = str.indexOf(target, pos + 1)) != -1) {
  alert( pos );
}
Ashok R.
quelle
0

substr_count übersetzt nach Javascript von PHP


function substr_count (haystack, needle, offset, length) { 
  // eslint-disable-line camelcase
  //  discuss at: https://locutus.io/php/substr_count/
  // original by: Kevin van Zonneveld (https://kvz.io)
  // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)
  // improved by: Brett Zamir (https://brett-zamir.me)
  // improved by: Thomas
  //   example 1: substr_count('Kevin van Zonneveld', 'e')
  //   returns 1: 3
  //   example 2: substr_count('Kevin van Zonneveld', 'K', 1)
  //   returns 2: 0
  //   example 3: substr_count('Kevin van Zonneveld', 'Z', 0, 10)
  //   returns 3: false

  var cnt = 0

  haystack += ''
  needle += ''
  if (isNaN(offset)) {
    offset = 0
  }
  if (isNaN(length)) {
    length = 0
  }
  if (needle.length === 0) {
    return false
  }
  offset--

  while ((offset = haystack.indexOf(needle, offset + 1)) !== -1) {
    if (length > 0 && (offset + needle.length) > length) {
      return false
    }
    cnt++
  }

  return cnt
}

Schauen Sie sich Locutus 'Übersetzung der Funktion substr_count von Php an

Zachary Horton
quelle
-2

Versuche dies:

function countString(str, search){
    var count=0;
    var index=str.indexOf(search);
    while(index!=-1){
        count++;
        index=str.indexOf(search,index+1);
    }
    return count;
}
Diogo Arenhart
quelle