স্ট্রিংয়ে স্ট্রিং উপস্থিতি গণনা কিভাবে?


606

অন্য স্ট্রিংয়ে নির্দিষ্ট স্ট্রিংয়ের সংখ্যাটি আমি কীভাবে গণনা করব? উদাহরণস্বরূপ, আমি জাভাস্ক্রিপ্টে এটি করার চেষ্টা করছি:

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

19
এটি ওভারল্যাপিং দৃষ্টান্তগুলি গ্রহণ করে কিনা তার উপর নির্ভর করে , যেমন var t = "sss"; উপরের স্ট্রিংয়ের "এসএস" স্ট্রিংয়ের কতটি উদাহরণ রয়েছে? 1 বা 2? আপনি কি প্রতিটি উদাহরণের উপর ঝাঁপিয়ে পড়েছেন, বা পয়েন্টার অক্ষর দ্বারা অক্ষরটি সরানোর জন্য অনুসন্ধান করছেন?
টিম

4
এই প্রশ্নের উত্তরের জন্য একটি উন্নত মানদণ্ড: jsperf.com/string-ocurrence-split-vs-match/2 (কাজজিকিকের মানদণ্ডের ভিত্তিতে)।
idmean

উত্তর:


1027

gরেগুলার এক্সপ্রেশন (জন্য সংক্ষেপে বিশ্বব্যাপী ) পুরো স্ট্রিং অনুসন্ধান করতে বদলে শুধুমাত্র প্রথম সংঘটন খুঁজে বলেছেন। এটি isদু'বার মেলে :

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

এবং, যদি কোনও মিল নেই, তবে এটি ফিরে আসে 0:

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


3
আধুনিক এবং মার্জিত, তবে ভিটিমটকের সমাধানটি আরও কার্যকর। আপনি তার কোড সম্পর্কে কি মনে করেন?
TruMan1

5
এটি প্রশ্নের সেরা উত্তর দেয়। যদি কেউ জিজ্ঞাসা করে যে "বিশেষ ক্ষেত্রে আমি কীভাবে এটি 10x দ্রুত করতে পারি (রেজিেক্সপস ছাড়াই)" ভিটিমটক সেই প্রশ্নটি জিততে পারে।
জাজাগন

121
এর জন্য ধন্যবাদ .. আপনার সাথে count = (str.match(/is/g) || []).lengthম্যাচ না থাকলে আমি পরিচালনা করতে গেলাম ।
ম্যাট

6
আমি মনে করি না এই উত্তরটি প্রশ্নের সঠিকভাবে মিলেছে, কারণ এটি ব্যবহারের ক্ষেত্রে বর্ণিত হিসাবে, ম্যাচের পক্ষে যুক্তি হিসাবে কোনও স্ট্রিং নেয় না। অবশ্যই, আপনি RegExpকন্সট্রাক্টরটি ব্যবহার করে এবং আপনি যে স্ট্রিংটি সন্ধান করছেন তা পাস করে গতিশীলভাবে রিজেক্সপ তৈরি করতে পারেন তবে সেক্ষেত্রে আপনাকে সমস্ত মেটাচ্যারাক্টরকে এড়িয়ে যেতে হবে। সেই দৃশ্যে, খাঁটি স্ট্রিং পদ্ধতির চেয়ে ভাল।
ZER0

3
ম্যাট এর উত্তরে থাকা উচিত!
সেনাই

239
/** 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;
}

ব্যবহার

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

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

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

allowOverlapping

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

মিলগুলি:

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

ইউনিট পরীক্ষা

মাপকাঠি

আমি একটি বেঞ্চমার্ক পরীক্ষা করেছি এবং আমার ফাংশনটি 10 ​​গুণ বেশি দ্রুত হয় তবে গম্বোর দ্বারা পোস্ট করা রেজিএক্সএক্স ম্যাচ ফাংশন। আমার পরীক্ষার স্ট্রিংয়ের দৈর্ঘ্য 25 টি। 'ও' চরিত্রটির 2 টি উপস্থিতি রয়েছে। আমি সাফারিতে 1 000 000 বার মৃত্যুদন্ড কার্যকর করেছি।

সাফারি 5.1

বেঞ্চমার্ক> মোট সময় নির্বাহ: 5617 এমএস (রিজেক্সপ)

বেঞ্চমার্ক> মোট সময় নির্বাহ: 881 এমএস (আমার ফাংশন 6.4x দ্রুত)

ফায়ারফক্স 4

বেঞ্চমার্ক> মোট সময় নির্বাহ: 8547 এমএস (রেক্সেক্সপ)

বেঞ্চমার্ক> মোট সময় নির্বাহ: 634 এমএস (আমার ফাংশন 13.5x দ্রুত)


সম্পাদনা করুন: আমি পরিবর্তন করেছি

  • ক্যাশেড স্ট্রিংয়ের দৈর্ঘ্য

  • স্ট্রিং-এ টাইপ-কাস্টিং যুক্ত হয়েছে।

  • allowচ্ছিক 'অনুমতি ওভারল্যাপিং' পরামিতি যুক্ত করা হয়েছে

  • খালি সাবস্ট্রিং কেস জন্য সঠিক "" আউটপুট স্থির করা হয়েছে।

সারকথা

5
আমি সাফারি 5 এ এই পরীক্ষার পুনরাবৃত্তি করেছি এবং একটি ছোট (100 বি) স্ট্রিংয়ের সাথে একই রকম ফলাফল পেয়েছি, তবে একটি বৃহত্তর স্ট্রিং (16 কেবি) দিয়ে, রেজেেক্সটি আমার জন্য দ্রুত ছড়িয়ে পড়ে। এক পুনরাবৃত্তির জন্য (1,000,000 নয়), পার্থক্যটি যাইহোক যাইহোক মিলিসেকেন্ডের চেয়ে কম ছিল, তাই আমার ভোটটি রেজেক্সে যায়।
আরলোমেডিয়া

2
+1, তবে আপনি substring.lengthপ্রায় প্রতিটি লুপ পরীক্ষা করে while
দেখছেন

1
@ ajax333221 ওএমজি আপনি আমার মন পড়েন, আমি এই উন্নতি কিছুদিন আগে করেছি এবং আমি আমার উত্তরটি jsperf.com/count-string-occurrence-in-string
ভিটিম.ওস

4
আমি আপনার কোডটি এখানে ব্যবহারের মধ্যে খুঁজে পেয়েছি: সাফল্য- জিজ্ঞাসা । সত্যিই দুর্দান্ত প্রোগ্রামার মনে মনে একটা রেফারেন্স রেখেছিল ed
ব্রুনো কিম

3
@DanielZuzevich এটি ধরনের নিগৃহীত হবে স্ট্রিং আপনাকে যা ক্ষেত্রে, occurrences(11,1) //2এবং এটি এখনও কাজ করবে। (এটা দ্রুত পরিবর্তে ধরনের জন্য চেক করে কলিং এই ভাবে করছে toString () )
Vitim.us

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

4
এটি একটি অনিরাপদ / বেঠিক পদ্ধতির, উদাহরণস্বরূপ হল: countInstances("isisisisisis", "is") === 0
নিক ক্র্যাভার

5
@ আন্টাল - ক্রোমের আগের বিটা বিল্ডে বাগের মতো দেখতে, সর্বশেষে আপডেট করার পরে কাজ করে, যদিও আমি এখনও এই পদ্ধতিটি পরিষ্কার করছি।
নিক ক্র্যাভার

28
এটি আমার কাছে পুরোপুরি বৈধ সমাধানের মতো দেখাচ্ছে।
গ্রেগর শ্মিট

2
@ নিকক্রাভার কৌতূহল থেকে দূরে, কেন আপনি এই পদ্ধতিটি পরিষ্কার করতে চান? (আপনার বিটা ব্রাউজারে বাগ ছাড়া অন্য)
জনি লিন

6
@ জনিলিন এটি অপ্রয়োজনীয় বরাদ্দ তৈরি করে যা আপনি অবিলম্বে ফেলে দিতে পারেন বিকল্পগুলি না করলে - সম্ভাব্যভাবে ডেটা উপর নির্ভর করে খুব বড় পরিমাণে।
নিক ক্র্যাভার

88

আপনি এটি চেষ্টা করতে পারেন:

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


14
সরলতার জন্য +1 এবং কারণ অনুসারে আমার পরীক্ষাগুলি অনুসারে এই দ্রবণটি অন্যদের চেয়ে 10x ডলার দ্রুত চলে !
ক্লোদিও হল্যান্ডা

উদাহরণস্বরূপ আমার দুটি আছে "আপনি" কীভাবে আপনি প্রত্যেকের অবস্থান পাবেন?
র্যাপিডুডল

@ অরবিটের উত্তরে যেমন আলোচনা করা হয়েছে, লোকেরা ক্রোমের পুরানো সংস্করণে বিভিন্ন ফলাফল পাচ্ছে। আমি সম্ভবত এই পদ্ধতিটি ব্যবহার করে কিছুটা সতর্ক থাকব।
mgthomas99

এবং আপনি এটি ভেরিয়েবলগুলির সাথেও ব্যবহার করতে পারেন: theString.split(myvar).length - 1যা আপনি সাধারণ রেজেেক্সের সাথে ক্যান্ট করেন না
স্টিফান

4
এটি তিন বছর পরে @ অরবিতের জবাব ...
অলিসডজি কোডিড্যাকট.কম

33

আমার সমাধান:

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


5
ফিরে আসার চেয়ে ভাল হবে (str.match (regExp) || []) দৈর্ঘ্য; আপনি নিয়মিত ভাবটি দুবার মূল্যায়ন করেন না?
আইকারু

2
আপনার নিজের স্ট্রিংটিও স্কেপ করতে হবে countOcurrences('Hello...','.')==8এবং 3 নয়
ভিটিম.ইস

19

আপনি matchযেমন ফাংশন সংজ্ঞায়িত করতে ব্যবহার করতে পারেন :

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

1
আপনি যদি এটিটি জেএসের অনুসন্ধান শব্দার্থবিজ্ঞানের সাথে অভিন্ন হতে চেয়েছিলেন তবে রিটার্ন লাইন হবে return m ? m.length:-1;
কনর ও'ব্রায়েন

এটি উপরের অন্যান্য রেজেক্স সমাধানগুলির চেয়ে ভাল, কারণ স্ট্রিংগুলির উপস্থিতিগুলি গণনা করার জন্য যদি স্ট্রিংটি "[" বা রেজেেক্সের একটি বিশেষ অর্থযুক্ত কোনও কিছু থাকে তবে এগুলি একটি ত্রুটি ঘটায়।
programmer5000

11

নন-রেজেক্স সংস্করণ:

 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


1. এটা শুধুমাত্র একক গৃহস্থালির কাজ অনুসন্ধান জন্য, খুব সূক্ষ্ম 2. এমনকি ওপি জন্য অনুরোধ isoccurences
vladkras

1
এটি সম্ভবত এখানে দ্রুততম বাস্তবায়ন, তবে আপনি যদি "++ পোজ" "পোজ + = অনুসন্ধানের জন্য অনুসন্ধান করুন.মর্যাদায়" প্রতিস্থাপন করেন তবে এটি আরও দ্রুত হবে
হ্যানশেরিক



8

এখানে দ্রুততম ফাংশন!

কেন এটি দ্রুত?

  • চর দ্বারা চেক করে না (1 ব্যতিক্রম সহ)
  • লুপ চেক করতে এবং 2 টি ভার্সেন্ট বাড়ানোর জন্য সাধারণত কিছু সময় এবং ইনক্রিমেন্ট 1 টি (চর গণনা ভেরি) ব্যবহার করে
  • WAY কম ভার্স ব্যবহার করে
  • রিজেক্স ব্যবহার করে না!
  • একটি (আশাকরি) অত্যন্ত অনুকূলিত ফাংশন ব্যবহার করে
  • সমস্ত ক্রিয়াকলাপ যেমন করা যায় ততগুলি সম্মিলিত, একাধিক ক্রিয়াকলাপের কারণে মন্দা এড়ানো

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

এখানে একটি ধীর এবং আরও পাঠযোগ্য সংস্করণ:

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

কাউন্টার, দীর্ঘ বর্ণের নাম এবং 1 টির অপব্যবহারের কারণে এটি এক ধীর।

এটি ব্যবহার করতে, আপনি কেবল এটি করুন:

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

সম্পাদনা করুন: (2013/12/16)

অপেরা 12.16 বা তার বেশি বয়সীদের সাথে ব্যবহার করবেন না! এটি রেগেক্স সমাধানের চেয়ে প্রায় 2.5x বেশি সময় নেবে!

ক্রোমে, এই দ্রবণটি ১,০০,০০০ অক্ষরের জন্য ১৪ মিমি এবং ২০ মিলিমিটারের মধ্যে নেবে।

রেজেক্স দ্রবণটি একই পরিমাণের জন্য 11-14 মিমি লাগে।

একটি ফাংশন ব্যবহার করে (বাইরে) String.prototype ) করতে 10-10ms লাগবে।

এখানে ব্যবহৃত কোডটি রয়েছে:

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

সমস্ত সমাধানের ফলাফল 100,000 হওয়া উচিত!

নোট: আপনি, পরিবর্তন এই ফাংশন তুলনায় আরো 1 গৃহস্থালির কাজ গণনা করতে চান কোথায় c=(c+'')[0]মধ্যেc=c+''


1
প্রোটোটাইপ ছিল একটি উদাহরণ! আপনি দয়া করে ফাংশনটি ব্যবহার করতে পারেন! আপনি এটি করতেও পারেন: var বার ফাংশনএক্সিস্ট = ফাংশন (x, c) {var t = 0, l = 0, c = (c + '') [0]; যখন (l = x.indexOf (c, l) +1 ) ++ টি; রিটার্ন টি}); সতর্কতা (timesCharExist ('চর "এ" কেবল দু'বার দেখাবে', 'এ'))! (এটি প্রোটোটাইপগুলিতে গণ্ডগোল করব না এমন আরও কিছু কারণ বাড়িয়ে দেবে)। আপনি যদি মনে করেন আমি ভুল, তবে আমার দিকে শিলা ছোঁড়ার আগে আপনি এটিকে কেন দেখান না? আমাকে প্রমাণ করুন যে আমার ফাংশন সফল হয় এবং আমি এটি গ্রহণ করব। আমাকে একটি পরীক্ষার কেস দেখান। এবং vars দৈর্ঘ্যের গতি উপর প্রভাব আছে। আপনি এটি পরীক্ষা করতে পারেন।
ইসমাইল মিগুয়েল


4

আমি মনে করি রেগেক্সের উদ্দেশ্যটি এর থেকে অনেক আলাদা indexOfindexOfরেগেক্সে আপনি ওয়াইল্ডকার্ড ব্যবহার করতে পারেন এমন কোনও নির্দিষ্ট স্ট্রিংয়ের উপস্থিতিটি সন্ধান করুন [A-Z]যার অর্থ এটি আসল চরিত্রটি উল্লেখ না করে শব্দের মধ্যে যে কোনও মূলধন অক্ষর খুঁজে পেতে পারে ।

উদাহরণ:

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


3

সুপার ডুপার পুরানো, তবে আমার আজকের মতো কিছু করার দরকার ছিল এবং কেবলমাত্র পরে এসও পরীক্ষা করার জন্য ভাবা হয়েছিল। আমার জন্য বেশ দ্রুত কাজ করে।

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

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

দেখুন: - স্ট্রিং- এ ধাপে ধাপে ব্যাখ্যার জন্য একটি স্ট্রিংং গণনা করুন


3

উপরে @ ভিটিম.ইস উত্তর উপর বিল্ডিং। আমি তার পদ্ধতিটি আমাকে দেওয়া নিয়ন্ত্রণটি পছন্দ করি, এটি প্রসারিত করা সহজ করে তোলে, তবে আমার কেস সংবেদনশীলতা যোগ করতে হবে এবং বিরামচিহ্নের সমর্থনে পুরো শব্দগুলিতে ম্যাচগুলি সীমাবদ্ধ করতে হবে। (যেমন "স্নান" "স্নান করুন" তে রয়েছে তবে "স্নান" নয়)

যতিচিহ্নটি রেগেক্স এসেছে: https://stackoverflow.com/a/25575009/497745 ( আমি কীভাবে জাভাস্ক্রিপ্টের স্ট্রিং থেকে রেগেক্স ব্যবহার করে সমস্ত বিরামচিহ্নগুলি কেটে ফেলতে পারি? )

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

আপনি যদি বাগ বা উন্নতিগুলি খুঁজে পান তবে দয়া করে এই উত্তরটি সংশোধন ও পুনরায় সংশোধন করুন।


3

যে ভবিষ্যতে এই থ্রেড খুঁজে বের করে কারো জন্য, নোট গৃহীত উত্তর সবসময় সঠিক মান করবে না যদি আপনি এটি সর্বজনীন, যেহেতু এটি মত Regex অপারেটর শ্বাসরোধ হবে $এবং .। এখানে একটি ভাল সংস্করণ, যে কোনও সুই পরিচালনা করতে পারে :

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

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

স্ট্রিংয়ে উভয় অক্ষর এবং স্ট্রিংয়ের উপস্থিতি খুঁজে পেতে get_occurrence (varS, স্ট্রিং) ব্যবহার করুন।



2

রেগেক্স ছাড়াই সহজ সংস্করণ:

var temp = "This is a string.";

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

alert(count);


3
এটি ছয় বছর পরে অরবিতের জবাব ...
অলিসডজি কোডিড্যাকট.কম

2

এটি আর কেউ দেখতে পাবে না তবে একবারে পুনরাবৃত্তি এবং তীর ফাংশনগুলি একবারে ফিরিয়ে নেওয়া ভাল (গৌরবজনকভাবে উদ্দেশ্যযুক্ত)

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

2

এটা চেষ্টা কর

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

ফিডল লিংক: https://jsfiddle.net/rajaramtt/gn0dtsjc/1/


1

এখন এটি একটি খুব পুরানো থ্রেড যা আমি পেরিয়ে এসেছি কিন্তু অনেকেই তাদের উত্তরটির দিকে ঠেলে দিয়েছে, এই সাধারণ কোডটি দিয়ে কাউকে সহায়তা করার প্রত্যাশায় আমার এখানে।

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

আমি নিশ্চিত নই যে এটি দ্রুততম সমাধান কিনা তবে আমি এটিকে সরলতার জন্য এবং রেজেক্স ব্যবহার না করার জন্য পছন্দ করেছি (আমি কেবল তাদের ব্যবহার পছন্দ করি না!)


1

এই ফাংশনটি পাঠ্যে কোনও শব্দের সংঘটনগুলির সংখ্যা প্রদান করে।

নোট এবং শব্দের পাঠ্যটির বিন্যাস (মূলধন, বড় হাতের ...) যাই হোক না কেন ঘটনার সংখ্যা গণনা করার জন্য আমরা লাওয়ারকেসে টু ব্যবহার করি

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

0

লেয়ানড্রো বাটিস্তার জন্য উত্তর: কেবলমাত্র রেগেক্স এক্সপ্রেশন নিয়ে সমস্যা।

 "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>


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


0

কিছুটা দেরি করেও, ধরে নেওয়া আমাদের নীচের স্ট্রিং রয়েছে:

var temp = "This is a string.";

প্রথমে আমরা যা কিছু মিলিয়ে দেখতে চাইছি তাতে বিভক্ত হয়ে যাব, এটি স্ট্রিংগুলির একটি অ্যারে ফিরিয়ে দেবে।

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

তারপরে আমরা এর দৈর্ঘ্য পাই এবং এটির 1 টি বিয়োগ করায় যেহেতু বিভক্ত ডিফল্ট 1 মাপের অ্যারেরে বিভক্ত হয় এবং ফলস্বরূপ প্রতিবার যখন কোনও ঘটনা খুঁজে পাওয়া যায় তখন এর আকারটি বাড়িয়ে তোলে।

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

আপনি নীচের মত এক লাইনে এই সব করতে পারেন:

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

আশা করি এটি সাহায্য করবে: ডি


1
আমি এটি সদৃশ উত্তর হিসাবে পতাকাঙ্কিত করতে পারি? আপনার নিজের সরবরাহ করার আগে আপনার সমস্ত উত্তর পড়তে হবে?
মিশিগেল

2
এটি আট বছর পরে @ অরবিতের উত্তর ...
এওল্ডডিজ কোডিড্যাকট.কম

1
আমি তখন এই প্রতিক্রিয়া মুছে ফেলা উচিত?
হুয়ান এনরিক সেগেব্রে

0

এই সমাধানটি সেই .replace()পদ্ধতির উপর ভিত্তি করে যা একটি রেজিএক্সকে প্রথম প্যারামিটার হিসাবে গ্রহণ করে এবং দ্বিতীয় পরামিতি হিসাবে কোনও ফাংশন যা আমরা কাউন্টারকে বাড়ানোর জন্য ক্লোজার হিসাবে ব্যবহার করতে পারি ...

/**
 * 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
}

ব্যবহার

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

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

0

এই পোস্ট জুড়ে এসেছিল।

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
}

একই অ্যালগরিদম আরও ছোট করা যায়:

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

0

substr_count পিএইচপি থেকে জাভাস্ক্রিপ্ট অনুবাদ


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
}

লোকটাসের অনুবাদ পিএইচপি-র সাবস্ট্র_কাউন্ট ফাংশনটি দেখুন


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.