मैं किसी विशेष स्ट्रिंग को किसी अन्य स्ट्रिंग में कितनी बार गिन सकता हूं। उदाहरण के लिए, यह वही है जो मैं जावास्क्रिप्ट में करने की कोशिश कर रहा हूं:
var temp = "This is a string.";
alert(temp.count("is")); //should output '2'
मैं किसी विशेष स्ट्रिंग को किसी अन्य स्ट्रिंग में कितनी बार गिन सकता हूं। उदाहरण के लिए, यह वही है जो मैं जावास्क्रिप्ट में करने की कोशिश कर रहा हूं:
var temp = "This is a string.";
alert(temp.count("is")); //should output '2'
जवाबों:
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);
count = (str.match(/is/g) || []).length
अगर आपके पास मैच नहीं है तो मैं संभालूंगा।
RegExp
और उस स्ट्रिंग को पास कर सकते हैं जिसकी आप तलाश कर रहे हैं, लेकिन उस स्थिति में आपको सभी मेटाचैकर्स से बचना होगा। उस परिदृश्य में, एक शुद्ध स्ट्रिंग दृष्टिकोण बेहतर है।
/** 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
occurrences("foofoofoo", "foofoo", true); //2
मेल खाता है:
foofoofoo
1 `----´
2 `----´
सारमैंने एक बेंचमार्क टेस्ट किया है और मेरा फंक्शन 10 गुना ज्यादा तेज है और फिर रेम्बेक्सप फंक्शन फंक्शन गंबो द्वारा पोस्ट किया गया है। मेरे परीक्षण में स्ट्रिंग 25 वर्णों की लंबाई है। चरित्र 'ओ' के 2 घटनाओं के साथ। मैंने सफारी में 1 000 000 बार निष्पादित किया।
सफारी 5.1
बेंचमार्क> कुल समय निष्पादन: 5617 एमएस (regexp)
बेंचमार्क> कुल समय निष्पादन: 881 एमएस (मेरा कार्य 6.4x तेज)
फ़ायरफ़ॉक्स ४
बेंचमार्क> कुल समय निष्पादन: 8547 एमएस (रेक्सएक्सएक्स)
बेंचमार्क> कुल समय निष्पादन: 634 एमएस (मेरा कार्य 13.5x तेज)
संपादित करें: मेरे द्वारा किए गए परिवर्तन
कैश्ड सबरिंग लंबाई
स्ट्रिंग में टाइप-कास्टिंग जोड़ा गया।
जोड़ा गया वैकल्पिक 'allowOverlapping' पैरामीटर
खाली प्रतिस्थापन मामले के लिए सही आउटपुट तय किया गया।
substring.length
लगभग हर लूप की जांच कर रहे हैं , आपको इसे बाहर कैशिंग करने पर विचार करना चाहिएwhile
occurrences(11,1) //2
और यह अभी भी काम करेगा। (यह तेजी से टाइप करने के लिए जाँच करने और कॉल करने के बजाय इस तरह से कर रहा है () )
function countInstances(string, word) {
return string.split(word).length - 1;
}
countInstances("isisisisisis", "is") === 0
:।
आप यह कोशिश कर सकते हैं:
var theString = "This is a string.";
console.log(theString.split("is").length - 1);
theString.split(myvar).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'));
countOcurrences('Hello...','.')==8
आप match
ऐसे फ़ंक्शन को परिभाषित करने के लिए उपयोग कर सकते हैं :
String.prototype.count = function(search) {
var m = this.match(new RegExp(search.toString().replace(/(?=[.\\+*?[^\]$(){}\|])/g, "\\"), "g"));
return m ? m.length:0;
}
return m ? m.length:-1;
।
गैर-रेगेक्स संस्करण:
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
is
घटनाओं के लिए पूछता है
बस कोड-गोल्फ रेबेका Chernoff के समाधान :-)
alert(("This is a string.".match(/is/g) || []).length);
String.prototype.Count = function (find) {
return this.split(find).length - 1;
}
console.log("This is a string.".Count("is"));
यह 2 लौटेगा।
यहाँ सबसे तेज़ कार्य है!
यह तेज क्यों है?
सभी ऑपरेशन जितने संयुक्त हैं, उतने ऑपरेशन के कारण मंदी से बच सकते हैं
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 अधिक लेगा!
क्रोम पर, यह समाधान 1,000,000 वर्णों के लिए 14ms और 20ms के बीच ले जाएगा।
रेगेक्स समाधान उसी राशि के लिए 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+''
var temp = "This is a string.";
console.log((temp.match(new RegExp("is", "g")) || []).length);
मुझे लगता है कि रेगेक्स का उद्देश्य इससे बहुत अलग है indexOf
।
indexOf
बस एक निश्चित स्ट्रिंग के रोचकता का पता लगाएं, जबकि रेगेक्स में आप वाइल्डकार्ड का उपयोग कर सकते हैं, [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);
सुपर डुपर पुराना, लेकिन मुझे आज ऐसा कुछ करने की जरूरत थी और केवल एसओ की जांच करने के लिए सोचा। मेरे लिए बहुत तेजी से काम करता है।
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));
स्ट्रिंग में अक्षर और स्ट्रिंग दोनों की घटना को खोजने के लिए get_occurrence (varS, string) का उपयोग करें।
कोशिश करो
<?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>
रेगेक्स के बिना सरल संस्करण:
var temp = "This is a string.";
var count = (temp.split('is').length - 1);
alert(count);
इसे इस्तेमाल करे
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/
अब यह एक बहुत पुराना धागा है जो मुझे आया है, लेकिन जैसे ही कई लोगों ने अपना उत्तर दिया है, यहाँ मेरा इस सरल कोड से किसी की मदद करने की उम्मीद है।
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);
मुझे यकीन नहीं है कि यह सबसे तेज़ समाधान है, लेकिन मैंने इसे सादगी के लिए पसंद किया है और रेगेक्स का उपयोग नहीं करने के लिए (मुझे बस उनका उपयोग करना पसंद नहीं है!)
यह फ़ंक्शन पाठ में किसी शब्द की घटनाओं की संख्या लौटाता है।
ध्यान दें कि हम वर्ड और टेक्स्ट के फॉर्मेट (कैपिटल, अपरकेस ...) में होने वाली घटनाओं की संख्या की गणना करने के लिए toLowerCase का उपयोग करते हैं।
wordCount(text, word) {
if (!text || !word) {
return 0;
}
text = text.toLowerCase();
word = word.toLowerCase();
return ( text.split( word ).length - 1 );
}
लिएंड्रो बतिस्ता का जवाब: रेगेक्स एक्सप्रेशन वाली समस्या।
"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>
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
थोड़ी देर लेकिन, यह मानते हुए कि हमारे पास निम्नलिखित स्ट्रिंग हैं:
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'
आशा है कि यह मदद करता है: डी
यह समाधान उस .replace()
पद्धति पर आधारित है जो एक RegEx को पहले पैरामीटर के रूप में स्वीकार करता है और दूसरे पैरामीटर के रूप में एक फ़ंक्शन जिसे हम एक काउंटर को बढ़ाने के लिए एक बंद के रूप में उपयोग कर सकते हैं ...
/**
* 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
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 );
}
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
}
Php के root_count फ़ंक्शन का Locutus का अनुवाद देखें
इसे इस्तेमाल करे:
function countString(str, search){
var count=0;
var index=str.indexOf(search);
while(index!=-1){
count++;
index=str.indexOf(search,index+1);
}
return count;
}