दिलचस्प पोस्ट
एकाधिक स्तंभ समुच्चय के साथ SQL सर्वर पिवोट तालिका JQuery में टेक्स्ट स्ट्रिंग खोजें और इसे बोल्ड करें HTML5 ऑडियो लूपिंग पायथन: HTTP स्ट्रीमिंग के साथ एक बड़ी फ़ाइल पोस्ट करें Linux / Unix पर स्थायी रूप से $ PATH कैसे सेट करें? .NET में, जो लूप तेजी से चलाता है, 'के लिए' या 'foreach'? वसंत MVC + + JSON = 406 स्वीकार्य नहीं दो SQL सर्वर डेटाबेस (स्कीमा और डेटा) की तुलना करने के लिए सबसे अच्छा उपकरण क्या है? JSON को सीएसवी / एक्सएलएस परिवर्तित करना? DbContext को कैसे रीफ़्रेश करें चुनें बनाम चुनिंदा कॉलम सबसे तेज़ बच्चे हैं () या jQuery में () ढूंढें? छात्रों को इंटरफेस समझाते हुए जावास्क्रिप्ट में मैं एकाधिक विभाजक के साथ एक स्ट्रिंग कैसे विभाजित करूं? यह कैसे बताने के लिए कि एक बिंदु एक पंक्ति के दाईं ओर या बाईं तरफ है

स्ट्रिंग में स्ट्रिंग की घटना को कैसे गणना करना है?

किसी स्ट्रिंग में किसी स्ट्रिंग में कितनी बार गणना की जा सकती है I उदाहरण के लिए, यह मैं जावास्क्रिप्ट में करने का प्रयास कर रहा हूं:

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

वेब के समाधान से एकत्रित समाधान "स्ट्रिंग में स्ट्रिंग की घटना को कैसे गणना करना है?"

नियमित अभिव्यक्ति में g ( ग्लोबल के लिए कम) केवल पहली घटना को खोजने के बजाय पूरी स्ट्रिंग खोजना कहती है:

 var temp = "This is a string."; var count = (temp.match(/is/g) || []).length; console.log(count); 
 /** 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 गुना तेज है और फिर regexp मैच फंक्शन गुंबो द्वारा पोस्ट किया गया है। मेरे परीक्षण स्ट्रिंग में 25 वर्ण की लंबाई है। चरित्र 'ओ' के 2 घटनाओं के साथ मैंने सफारी में 1 000 000 बार मार डाला

सफारी 5.1

बेंचमार्क> कुल समय निष्पादन: 5617 एमएस (रेगेक्स)

बेंचमार्क> कुल समय निष्पादन: 881 एमएस (मेरा कार्य 6.4x तेज)

फ़ायरफ़ॉक्स 4

बेंचमार्क> कुल समय निष्पादन: 8547 एमएस (रेक्सएक्सपी)

बेंचमार्क> कुल समय निष्पादन: 634 एमएस (मेरे कार्य 13.5x तेज)


संपादित करें: मेरे द्वारा किए गए परिवर्तन

  • कैश सबस्ट्रिंग लंबाई

  • स्ट्रिंग के लिए टाइप-कास्टिंग जोड़ा गया

  • जोड़ा गया वैकल्पिक 'allowOverlapping' पैरामीटर

  • खाली उपस्ट्रिंग केस के लिए सही आउटपुट ठीक करें।

सार

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

आप यह कोशिश कर सकते हैं:

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

मेरा समाधान:

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

आप ऐसे फ़ंक्शन को परिभाषित करने के लिए match का उपयोग कर सकते हैं:

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

यहां सबसे तेज़ काम है!

यह तेज़ क्यों है?

  • चार वर्णों के द्वारा जांच नहीं करता (1 अपवाद के साथ)
  • थोड़ी देर और वृद्धि 1 वर् (वर्क्स कॉन्टस वर्ट) बनाम लूप के लिए एक लूप की जाँच करता है और 2 वर्क्स (आमतौर पर वर् I और एक वर्ड को चार गिनती के साथ) बढ़ाता है
  • रास्ते कम वार्स का उपयोग करता है
  • Regex का उपयोग नहीं करता है!
  • एक (उम्मीद है) अत्यधिक अनुकूलित फ़ंक्शन का उपयोग करता है
  • सभी आपरेशनों को संयुक्त रूप से जोड़ा जा सकता है, क्योंकि वे कई परिचालनों के कारण मंदी से बच सकते हैं

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

यह एक काउंटर के कारण धीमा है, लंबे var नाम और 1 var का दुरुपयोग है।

इसका उपयोग करने के लिए, आप बस ऐसा करते हैं:

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

संपादित करें: (2013/12/16)

ओपेरा 12.16 या पुराने के साथ उपयोग न करें! यह लगभग 2.5x regex समाधान से अधिक ले जाएगा!

क्रोम पर, यह समाधान 1,00,000 वर्णों के लिए 14ms और 20ms के बीच ले जाएगा।

एक ही राशि के लिए regex समाधान 11-14ms लेता है

फ़ंक्शन ( String.prototype बाहर) का उपयोग करने में लगभग 10-13ms लगेंगे।

यहां उपयोग किया गया कोड है:

  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+'' बदलें

बस कोड- ऊपर समाधान समाधान गोल्फ 🙂

alert("This is a string." + match(/is/g).length);

गैर-रेगेक्स संस्करण:

  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 
 var temp = "This is a string."; console.log((temp.match(new RegExp("is", "g")) || []).length); 

मुझे लगता है कि regex के उद्देश्य indexOf से बहुत अलग है indexOf बस एक निश्चित स्ट्रिंग के अवसर को खोजने के लिए, जबकि regex में आप [AZ] जैसे वाइल्डकार्ड का उपयोग कर सकते हैं, जिसका अर्थ है कि वास्तविक चरित्र के बिना शब्द में किसी भी कैपिटल कैरेक्टर को मिलेगा।

उदाहरण:

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

String.prototype.Count = function (find) { return this.split(find).length - 1; } "This is a string.".Count("is");

यह 2 लौटाएगा

सुपर डुपर बूढ़ा, लेकिन मुझे आज ऐसा कुछ करने की आवश्यकता है और केवल सोचा था कि बाद में जांच मेरे लिए बहुत तेजी से काम करता है

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

संदर्भ: – चरण के आधार पर चरण के लिए स्ट्रिंग में एक उपस्ट्रिंग दिखाई देता है ।

ऊपर @ Vittim.us उत्तर पर बिल्डिंग मुझे नियंत्रण की तरह उनकी विधि मुझे देता है, यह विस्तार करना आसान बना रहा है, लेकिन मुझे विराम चिह्न के समर्थन के साथ केस असंवेदनशीलता और सीमा को पूरा शब्दों से जोड़ने की जरूरत है (जैसे "स्नान" में "स्नान करना" है, लेकिन "स्नान" नहीं है)

विराम चिह्न regex से आया था: https://stackoverflow.com/a/25575009/497745 ( मैं regex का उपयोग कर जावास्क्रिप्ट में एक स्ट्रिंग से सभी विराम चिह्न कैसे छू सकता हूँ? )

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

यदि आप कीड़े या सुधारों को देखते हैं, तो इस उत्तर को संशोधित करने और रीफैक्टर करने में संकोच न करें।

भविष्य में इस धागे को ढूंढने वाले किसी भी व्यक्ति के लिए, ध्यान रखें कि स्वीकृत जवाब हमेशा सही मान नहीं लौटाएगा यदि आप इसे सामान्य बनाना चाहते हैं, क्योंकि यह regex ऑपरेटरों जैसे $ और पर गड़बड़ाएगा . । यहाँ एक बेहतर संस्करण है, जो किसी भी सुई को संभाल सकता है:

 function occurrences (haystack, needle) { var _needle = needle .replace(/\[/g, '\\[') .replace(/\]/g, '\\]') return ( haystack.match(new RegExp('[' + _needle + ']', 'g')) || [] ).length } 
 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)); 

कोशिश करो

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

बिना संस्करण regex:

 var temp = "This is a string."; var count = (temp.split('is').length - 1); alert(count); 

अब यह एक बहुत पुराना धागा है जो मैंने पार किया है, लेकिन जैसा कि कई ने अपना जवाब धक्का दिया है, यहां यह मेरा है कि किसी को इस सरल कोड के साथ मदद करने की आशा है।

 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[letter.length - 1]; var count; for (var i = count = 0; i < search_value.length; count += (search_value[i++] == letter)); console.log(count); 

लेन्ड्रो बतिस्ता के लिए जवाब: रीजेक्स अभिव्यक्ति के साथ सिर्फ एक समस्या

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

इसे इस्तेमाल करे:

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