javascript شرح - كيفية حساب حدوث سلسلة في السلسلة؟




regular expression (21)

كيف يمكنني حساب عدد المرات التي تحدث فيها سلسلة معينة في سلسلة أخرى. على سبيل المثال ، هذا ما أحاول القيام به في Javascript:

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

Answers

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


/** 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://.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 مللي ثانية (regexp)

المعيار> إجمالي وقت التنفيذ: 881 مللي ثانية (وظيفتي 6.4x أسرع)

فايرفوكس 4

المعيار> إجمالي وقت التنفيذ: 8547 مللي ثانية (Rexexp)

المعيار> إجمالي وقت التنفيذ: 634 مللي ثانية (وظيفتي 13.5x أسرع)

تحرير: التغييرات التي قمت بها

  • طول السلسلة الفرعية المخزنة مؤقتًا

  • إضافة نوع الصب إلى السلسلة.

  • إضافة معلمة اختيارية "allowOverlapping"

  • إخراج صحيح ثابت لحالة فرعية فارغة.

جوهر

إصدار غير regex:

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

لست متأكدا ما إذا كان هذا هو الحل الأسرع ولكني فضلت ذلك للبساطة وعدم استخدام regex (أنا لا أحب استخدامها!)


بالنسبة إلى أي شخص يعثر على هذا الموضوع في المستقبل ، لاحظ أن الإجابة المقبولة لن تؤدي دائمًا إلى إرجاع القيمة الصحيحة إذا قمت بتعميمها ، نظرًا لأنها ستختنق على مشغلات regex مثل $ و . . هنا نسخة أفضل ، يمكنها التعامل مع أي إبرة:

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

يمكنك استخدام match لتعريف هذه الوظيفة:

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

نسخة بسيطة بدون تعبير:

var temp = "This is a string.";

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

alert(count);


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

جرب هذا:

function countString(str, search){
    var count=0;
    var index=str.indexOf(search);
    while(index!=-1){
        count++;
        index=str.indexOf(search,index+1);
    }
    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");

راجع: - تظهر سلسلة فرعية في السلسلة للتوضيح خطوة بخطوة.


var s = "1";replaced word
var a = "HRA"; //have to replace 
var str = document.getElementById("test").innerHTML;
var count = str.split(a).length - 1;
for (var i = 0; i < count; i++) {
    var s = "1";
    var a = "HRA";
    var str = document.getElementById("test").innerHTML;
    var res = str.replace(a, s);
    document.getElementById("test").innerHTML = res;
}

<input " type="button" id="Btn_Validate" value="Validate" class="btn btn-info" />
<div class="textarea"  id="test" contenteditable="true">HRABHRA</div>


بلدي الحل:

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


السوبر المخادع القديمة ، ولكن كنت بحاجة إلى القيام بشيء من هذا القبيل اليوم وفكرت فقط للتحقق SO بعد ذلك. يعمل بسرعة كبيرة بالنسبة لي.

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

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) للبحث عن تواجد كل من الحروف والسلسلة في سلسلة.


يقول g في التعبير العادي (اختصار عالمي ) للبحث في السلسلة بأكملها بدلاً من مجرد العثور على التواجد الأول:

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


متأخر قليلا ولكن على افتراض أننا لدينا السلسلة التالية:

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'

آمل أن يساعد: د


أعتقد أن الغرض من regex يختلف كثيرًا عن indexOf . indexOf ببساطة العثور على حدوث سلسلة معينة أثناء تعبير regex يمكنك استخدام أحرف البدل مثل [AZ] مما يعني أنه سيعثر على أي حرف رأس في الكلمة بدون ذكر الحرف الفعلي.

مثال:

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


يمكنك تجربة هذا:

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


بناء على @ Vittim.us الإجابة أعلاه. أنا أحب التحكم الذي يمنحه لي أسلوبه ، مما يجعله سهلًا للتوسع ، ولكني في حاجة إلى إضافة عدم مراعاة الحالة والحد من التطابق مع الكلمات بأكملها مع دعم علامات الترقيم. (على سبيل المثال "حمام" في "أخذ حمام." ولكن ليس "الاستحمام")

تم وضع regex الترقيم من: https://.com/a/25575009/497745 ( كيف يمكنني تجريد كل علامات الترقيم من سلسلة في JavaScript باستخدام 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\\'!"#$%&\(\)*+,\-.\/:;<=>[email protected]\[\]^_`{|}~]/.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\\'!"#$%&\(\)*+,\-.\/:;<=>[email protected]\[\]^_`{|}~]/.test(string[matchEnd])) //ignore punctuation
                    {
                        continue; //then this is not a match
                    }
                }
            }

            ++n;                
        } else break;
    }
    return n;
}

يُرجى عدم التردد في تعديل هذه الإجابة وإعادة صياغتها في حالة اكتشاف الأخطاء أو التحسينات.


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


واحد آخر ، لجميع مستخدمي الربيع:

import java.nio.charset.StandardCharsets;
import org.springframework.util.FileCopyUtils;

public String convertStreamToString(InputStream is) throws IOException { 
    return new String(FileCopyUtils.copyToByteArray(is), StandardCharsets.UTF_8);
}

org.springframework.util.StreamUtilsتتشابه أساليب المرافق مع تلك الموجودة في FileCopyUtils، ولكنها تترك الدفق مفتوحًا عند الانتهاء.





javascript regex string