Bagaimana cara menghitung string terjadinya dalam string?

Bagaimana saya bisa menghitung berapa kali string tertentu terjadi dalam string lain. Sebagai contoh, ini adalah apa yang saya coba lakukan dalam Javascript:

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

G dalam ekspresi regular (singkatan global) kata untuk mencari seluruh string bukan hanya menemukan kejadian pertama. Ini pertandingan adalah dua kali:

var temp = "Ini adalah sebuah string."; var count = (temp.match(/adalah/g) || []).panjang; konsol.log(hitung);

Dan, jika tidak ada pertandingan, itu kembali 0:

var temp = "Hello World!"; var count = (temp.match(/adalah/g) || []).panjang; konsol.log(hitung);

Komentar (17)
/** 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) {
            ++n;
            pos += step;
        } else break;
    }
    return n;
}

Penggunaan

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

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

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

allowOverlapping

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

Pertandingan:

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

Unit Test

  • https://jsfiddle.net/Victornpb/5axuh96u/

Acuan

I've dibuat patokan tes dan fungsi saya adalah lebih dari 10 kali lebih cepat maka regexp pertandingan fungsi diposkan oleh gumbo. Dalam tes saya string adalah 25 karakter panjang. dengan 2 kejadian karakter 'o'. Saya dieksekusi 1 000 000 kali di Safari.

Safari 5.1

Patokan> Total waktu eksekusi: 5617 ms (regexp)

Patokan> Total waktu eksekusi: 881 ms (saya fungsi 6.4 x lebih cepat)

Firefox 4

Patokan> Total waktu eksekusi: 8547 ms (Rexexp)

Patokan> Total waktu eksekusi: 634 ms (fungsi saya 13.5 x lebih cepat)


Edit: perubahan I've dibuat

  • cached substring panjang

  • menambahkan jenis-casting untuk string.

  • ditambahkan opsional 'allowOverlapping' parameter

  • fixed output yang benar untuk "," kosong substring kasus.

Gist

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

Anda dapat mencoba ini:

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

Solusi saya:

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'));
Komentar (2)

Anda dapat menggunakan cocok untuk mendefinisikan fungsi seperti:

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

Non-regex versi:

 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
Komentar (2)

Hanya kode-golf Rebecca Chernoff's solusi :-)

alert(("This is a string.".match(/is/g) || []).length);
Komentar (0)
String.prototype.Count = function (find) {
    return this.split(find).length - 1;
}

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

Ini akan kembali 2.

Komentar (1)

Berikut ini adalah cara tercepat fungsi!

Kenapa lebih cepat?

  • Doesn't check char oleh char (dengan 1 pengecualian)
  • Menggunakan sementara dan penambahan 1 var (char menghitung var) vs. loop untuk memeriksa panjang dan incrementing 2 vars (biasanya var i dan var dengan char count)
  • Menggunakan CARA yang kurang vars
  • Doesn't menggunakan regex!
  • Menggunakan aplikasi yang (mudah-mudahan) sangat dioptimalkan fungsi
  • Semua operasi adalah sebagai gabungan seperti yang mereka dapat, menghindari perlambatan akibat beberapa operasi

String.prototipe.timesCharExist=function(c){var t=0,l=0,c=(c+'')[0];sementara(l=ini.indexOf(c,l)+1)++t;return t};

Berikut adalah lebih lambat dan lebih mudah dibaca versi:

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

Yang satu ini lebih lambat karena counter, panjang var nama dan penyalahgunaan 1 var.

Untuk menggunakannya, anda hanya melakukan ini:

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

Edit: (2013/12/16)

DON'T digunakan dengan Opera 12.16 atau lebih tua! ini akan memakan waktu hampir 2,5 x lebih dari regex solusi!

Di chrome, solusi ini akan memakan waktu antara 14ms dan 20ms untuk 1.000.000 karakter.

Regex solusi membutuhkan 11-14ms untuk jumlah yang sama.

Menggunakan fungsi (di luar String.prototipe) akan memakan waktu sekitar 10-13 menit.

Berikut adalah kode yang digunakan:

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

Hasil dari semua solusi harus 100,000!

Catatan: jika anda ingin fungsi ini untuk menghitung lebih dari 1 char, perubahan, di mana c=(c+'')[0] ke c=c+''

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

Saya pikir tujuan untuk regex adalah jauh berbeda dari indexOf. indexOf hanya menemukan kejadian dari suatu string tertentu sementara di regex anda dapat menggunakan wildcard seperti [A-Z] yang berarti ia akan menemukan setiap modal karakter dalam kata tanpa menyatakan karakter yang sebenarnya.

Contoh:

 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);
Komentar (0)

Bagi siapa saja yang menemukan thread ini di masa depan, perhatikan bahwa jawaban yang diterima tidak akan selalu menghasilkan nilai yang benar jika anda menggeneralisasi itu, karena itu akan tersedak pada regex operator seperti $ dan .. Berikut ini's versi yang lebih baik, yang dapat menangani setiap jarum:

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

Super duper lama, tapi aku harus melakukan sesuatu seperti ini hari ini dan hanya berpikir untuk memeriksa JADI, setelah itu. Bekerja dengan cukup cepat bagi saya.

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;
};
Komentar (0)
       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");

Lihat :- jumlah substring yang muncul dalam string untuk penjelasan langkah demi langkah.

Komentar (0)

Membangun di atas @Vittim.kami jawab di atas. Aku suka mengontrol metode memberi saya, sehingga mudah untuk memperpanjang, tapi aku harus menambahkan kasus ketidakpekaan dan membatasi cocok dengan seluruh kata-kata dengan dukungan untuk tanda baca. (misalnya "mandi" di "mandi." tetapi tidak "mandi")

Tanda baca regex berasal dari: https://stackoverflow.com/a/25575009/497745 (https://stackoverflow.com/questions/4328500/how-can-i-strip-all-punctuation-from-a-string-in-javascript-using-regex)

function keywordOccurrences(string, subString, allowOverlapping, caseInsensitive, wholeWord)
{

    string += "";
    subString += "";
    if (subString.length = 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;
}

Silahkan merasa bebas untuk memodifikasi dan refactor jawaban ini jika anda melihat bug atau perbaikan.

Komentar (0)
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));

Gunakan get_occurrence(varS,string) untuk menemukan terjadinya kedua karakter dan string dalam String.

Komentar (0)

Coba

<?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>
Komentar (0)

Tidak ada yang akan pernah melihat ini, tapi itu's baik untuk membawa kembali rekursi dan panah fungsi once in a while (mulia pun intended)

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

Versi sederhana tanpa regex:

var temp = "This is a string.";

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

alert(count);
Komentar (1)