কিভাবে একটি স্ট্রিং মধ্যে নবম সংঘটন পেতে?


104

আমি এরকম কিছু নিয়ে 2ndঘটনার সূচনা অবস্থানটি পেতে ABCচাই:

var string = "XYZ 123 ABC 456 ABC 789 ABC";
getPosition(string, 'ABC', 2) // --> 16

তুমি এটা কি ভাবে করবে?


দ্বিতীয় ঘটনাটি নাকি শেষ? :)
জ্যাক

বিভ্রান্তির জন্য দুঃখিত আমি শেষ সূচকটি খুঁজছি না। আমি nthঘটনার প্রথম অবস্থানটি সন্ধান করছি , এই ক্ষেত্রে দ্বিতীয়টি।
আদম

উত্তর:


158

const string = "XYZ 123 ABC 456 ABC 789 ABC";

function getPosition(string, subString, index) {
  return string.split(subString, index).join(subString).length;
}

console.log(
  getPosition(string, 'ABC', 2) // --> 16
)


26
আমি আসলে এই উত্তর পছন্দ করি না। আনবাউন্ডেড দৈর্ঘ্যের ইনপুট দেওয়া, এটি অকারণে একটি সীমাহীন দৈর্ঘ্যের অ্যারে তৈরি করে এবং এরপরে বেশিরভাগটি ফেলে দেয়। কেবল পুনরাবৃত্তভাবে fromIndexযুক্তিটি ব্যবহার করার জন্য এটি দ্রুত এবং আরও দক্ষ হবেString.indexOf
অ্যালিনিটাক

3
function getPosition(str, m, i) { return str.split(m, i).join(m).length; }
অনুলিপি করুন

9
আপনি যদি প্রতিটি প্যারামিটারের অর্থ বোঝায় তবে আমি ভাল হত।
চিরকাল

1
@ আগে কখনও আমি ওপি দ্বারা নির্ধারিত ফাংশনটি সহজভাবে প্রয়োগ করেছি
ডেনিস সাগুরেট

5
এই যদি সেখানে <আপনি স্ট্রিং এর দৈর্ঘ্য দিতে যাচ্ছেন iএর ঘটনার m। যা getPosition("aaaa","a",5)দেয় 4, যেমন দেয় getPosition("aaaa","a",72)! আমি মনে করি আপনি এই ক্ষেত্রে -1 চান। var ret = str.split(m, i).join(m).length; return ret >= str.length ? -1 : ret;এছাড়াও আপনি ধরতে পারেন i <= 0সঙ্গেreturn ret >= str.length || i <= 0 ? -1 : ret;
Ruffin

70

আপনি কোনও অ্যারে তৈরি না করে স্ট্রিং ইনডেক্সওফ ব্যবহার করতে পারেন।

দ্বিতীয় প্যারামিটারটি পরবর্তী ম্যাচটি সন্ধান করতে সূচক।

function nthIndex(str, pat, n){
    var L= str.length, i= -1;
    while(n-- && i++<L){
        i= str.indexOf(pat, i);
        if (i < 0) break;
    }
    return i;
}

var s= "XYZ 123 ABC 456 ABC 789 ABC";

nthIndex(s,'ABC',3)

/*  returned value: (Number)
24
*/

দৈর্ঘ্য ক্যাচিং এবং স্ট্রিং প্রোটোটাইপ না বাড়ানোর কারণে আমি এই সংস্করণটি পছন্দ করি।
ক্রিস্টোফ রাউসি

8
জাস্পফারফ অনুসারে এই পদ্ধতিটি স্বীকৃত উত্তরের চেয়ে অনেক দ্রুত
বুড়ো

বর্ধিতকরণ iকম বিভ্রান্তিকর করা যেতে পারে:var i; for (i = 0; n > 0 && i !== -1; n -= 1) { i = str.indexOf(pat, /* fromIndex */ i ? (i + 1) : i); } return i;
hlpcoding

1
আমি এটিকে গ্রহণযোগ্য উত্তরের চেয়ে পছন্দ করি যেমন আমি যখন দ্বিতীয় উদাহরণের জন্য পরীক্ষা করেছিলাম যা অন্য উত্তরটির অস্তিত্বই পায় না এমন প্রথম স্ট্রিংয়ের দৈর্ঘ্য ফিরে আসে যেখানে এইটি ফিরে আসে -1। একটি আপ-ভোট এবং আপনাকে ধন্যবাদ।
জন

2
এটি অবাস্তব যে এটি জেএস-এর বৈশিষ্ট্যযুক্ত নয়।
Sinister দাড়ি 12

20

কেনেবেকের জবাব বন্ধ করে দিয়ে, আমি একটি প্রোটোটাইপ ফাংশন তৈরি করেছি যা 0-এর পরিবর্তে নবম উপস্থিতিটি খুঁজে পাওয়া না গেলে -1 ফিরে আসবে।

String.prototype.nthIndexOf = function(pattern, n) {
    var i = -1;

    while (n-- && i++ < this.length) {
        i = this.indexOf(pattern, i);
        if (i < 0) break;
    }

    return i;
}

2
দেশীয় বৈশিষ্ট্যগুলির চূড়ান্ত অভিযোজন অবিচ্ছিন্নভাবে এই প্রোটোটাইপের দ্বারা ওভাররাইট হয়ে যেতে পারে বলে কখনও কখনও উটকেস ব্যবহার করবেন না। এই ক্ষেত্রে আমি (URL গুলির জন্য ড্যাশ) সমস্ত ছোট হাতের এবং আন্ডারস্কোর বলতে চাই: String.prototype.nth_index_of। এমনকি যদি আপনি ভাবেন যে আপনার নামটি অনন্য এবং যথেষ্ট পাগল তবে বিশ্ব প্রমাণ করবে যে এটি ক্রেজিয়ার করতে পারে এবং করতে পারে।
জন

বিশেষত প্রোটোটাইপিং করার সময়। অবশ্যই, কেউ কখনও সেই নির্দিষ্ট পদ্ধতির নামটি ব্যবহার করতে পারে না যদিও নিজেকে এটি করার অনুমতি দিয়ে আপনি একটি খারাপ অভ্যাস তৈরি করেন। যদিও সমালোচনামূলক উদাহরণ একটি ভিন্ন: সবসময় ঘিরা ডেটা একটি SQL করছেন INSERTযেমন mysqli_real_escape_stringকরে না একক উদ্ধৃতি হ্যাক বিরুদ্ধে রক্ষা করুন। পেশাদার কোডিংয়ের বেশিরভাগের পক্ষে কেবল ভাল অভ্যাস থাকা নয় তবে কেন এই ধরণের অভ্যাসগুলি গুরুত্বপূর্ণ তা বোঝা । :-)
জন

1
স্ট্রিং প্রোটোটাইপ প্রসারিত করবেন না।

4

কারণ পুনরাবৃত্তি সর্বদা উত্তর।

function getPosition(input, search, nth, curr, cnt) {
    curr = curr || 0;
    cnt = cnt || 0;
    var index = input.indexOf(search);
    if (curr === nth) {
        if (~index) {
            return cnt;
        }
        else {
            return -1;
        }
    }
    else {
        if (~index) {
            return getPosition(input.slice(index + search.length),
              search,
              nth,
              ++curr,
              cnt + index + search.length);
        }
        else {
            return -1;
        }
    }
}

1
@RenanCoelho টিল্ড ( ~:), bitwise জাভাস্ক্রিপ্ট নেই অপারেটর developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
সেবাস্টিয়ান

2

এখানে আমার সমাধানটি রয়েছে, যা nম্যাচগুলি না পাওয়া পর্যন্ত স্ট্রিংয়ের উপরে পুনরাবৃত্তি করে :

String.prototype.nthIndexOf = function(searchElement, n, fromElement) {
    n = n || 0;
    fromElement = fromElement || 0;
    while (n > 0) {
        fromElement = this.indexOf(searchElement, fromElement);
        if (fromElement < 0) {
            return -1;
        }
        --n;
        ++fromElement;
    }
    return fromElement - 1;
};

var string = "XYZ 123 ABC 456 ABC 789 ABC";
console.log(string.nthIndexOf('ABC', 2));

>> 16

2

এই পদ্ধতিটি এমন একটি ফাংশন তৈরি করে যা অ্যারেতে সঞ্চিত নবম উপস্থিতির সূচকের জন্য কল করে

function nthIndexOf(search, n) { 
    var myArray = []; 
    for(var i = 0; i < myString.length; i++) { //loop thru string to check for occurrences
        if(myStr.slice(i, i + search.length) === search) { //if match found...
            myArray.push(i); //store index of each occurrence           
        }
    } 
    return myArray[n - 1]; //first occurrence stored in index 0 
}

আমি মনে করি না আপনি উপরের কোডটিতে মাইস্ট্রিং সংজ্ঞায়িত করেছেন, এবং নিশ্চিত নন যে মাইএসটিআর === মাইস্ট্রিং?
শেঠ ইডেন

1

অপ্রয়োজনীয় স্ট্রিং তৈরি না করে আরও ছোট উপায় এবং আমি আরও সহজ মনে করি।

const findNthOccurence = (string, nth, char) => {
  let index = 0
  for (let i = 0; i < nth; i += 1) {
    if (index !== -1) index = string.indexOf(char, index + 1)
  }
  return index
}

0

ব্যবহার indexOfএবং পুনরাবৃত্তি :

প্রথমে পরীক্ষা করুন যে নবম অবস্থানটি উত্তোলনের মোট সংখ্যার চেয়ে বড় কিনা। পাস হয়ে গেলে, নবম পাওয়া না পাওয়া পর্যন্ত প্রতিটি সূচকে পুনরাবৃত্তভাবে যেতে হবে।

var getNthPosition = function(str, sub, n) {
    if (n > str.split(sub).length - 1) return -1;
    var recursePosition = function(n) {
        if (n === 0) return str.indexOf(sub);
        return str.indexOf(sub, recursePosition(n - 1) + 1);
    };
    return recursePosition(n);
};

0

ব্যবহার [String.indexOf][1]

var stringToMatch = "XYZ 123 ABC 456 ABC 789 ABC";

function yetAnotherGetNthOccurance(string, seek, occurance) {
    var index = 0, i = 1;

    while (index !== -1) {
        index = string.indexOf(seek, index + 1);
        if (occurance === i) {
           break;
        }
        i++;
    }
    if (index !== -1) {
        console.log('Occurance found in ' + index + ' position');
    }
    else if (index === -1 && i !== occurance) {
        console.log('Occurance not found in ' + occurance + ' position');
    }
    else {
        console.log('Occurance not found');
    }
}

yetAnotherGetNthOccurance(stringToMatch, 'ABC', 2);

// Output: Occurance found in 16 position

yetAnotherGetNthOccurance(stringToMatch, 'ABC', 20);

// Output: Occurance not found in 20 position

yetAnotherGetNthOccurance(stringToMatch, 'ZAB', 1)

// Output: Occurance not found

0
function getStringReminder(str, substr, occ) {
   let index = str.indexOf(substr);
   let preindex = '';
   let i = 1;
   while (index !== -1) {
      preIndex = index;
      if (occ == i) {
        break;
      }
      index = str.indexOf(substr, index + 1)
      i++;
   }
   return preIndex;
}
console.log(getStringReminder('bcdefgbcdbcd', 'bcd', 3));

-2

আমি স্ট্যাকওভারফ্লোতে অন্য প্রশ্নের জন্য নিম্নলিখিত কোডটি নিয়ে খেলছিলাম এবং ভেবেছিলাম এটি এখানে উপযুক্ত হবে। ফাংশন প্রিন্টলিস্ট 2 একটি রেজেক্স ব্যবহারের অনুমতি দেয় এবং ক্রমযুক্ত সমস্ত উপস্থিতি তালিকাভুক্ত করে। (প্রিন্টলিস্ট একটি পূর্ববর্তী সমাধানের চেষ্টা ছিল, তবে এটি বেশ কয়েকটি ক্ষেত্রে ব্যর্থ হয়েছিল))

<html>
<head>
<title>Checking regex</title>
<script>
var string1 = "123xxx5yyy1234ABCxxxabc";
var search1 = /\d+/;
var search2 = /\d/;
var search3 = /abc/;
function printList(search) {
   document.writeln("<p>Searching using regex: " + search + " (printList)</p>");
   var list = string1.match(search);
   if (list == null) {
      document.writeln("<p>No matches</p>");
      return;
   }
   // document.writeln("<p>" + list.toString() + "</p>");
   // document.writeln("<p>" + typeof(list1) + "</p>");
   // document.writeln("<p>" + Array.isArray(list1) + "</p>");
   // document.writeln("<p>" + list1 + "</p>");
   var count = list.length;
   document.writeln("<ul>");
   for (i = 0; i < count; i++) {
      document.writeln("<li>" +  "  " + list[i] + "   length=" + list[i].length + 
          " first position=" + string1.indexOf(list[i]) + "</li>");
   }
   document.writeln("</ul>");
}
function printList2(search) {
   document.writeln("<p>Searching using regex: " + search + " (printList2)</p>");
   var index = 0;
   var partial = string1;
   document.writeln("<ol>");
   for (j = 0; j < 100; j++) {
       var found = partial.match(search);
       if (found == null) {
          // document.writeln("<p>not found</p>");
          break;
       }
       var size = found[0].length;
       var loc = partial.search(search);
       var actloc = loc + index;
       document.writeln("<li>" + found[0] + "  length=" + size + "  first position=" + actloc);
       // document.writeln("  " + partial + "  " + loc);
       partial = partial.substring(loc + size);
       index = index + loc + size;
       document.writeln("</li>");
   }
   document.writeln("</ol>");

}
</script>
</head>
<body>
<p>Original string is <script>document.writeln(string1);</script></p>
<script>
   printList(/\d+/g);
   printList2(/\d+/);
   printList(/\d/g);
   printList2(/\d/);
   printList(/abc/g);
   printList2(/abc/);
   printList(/ABC/gi);
   printList2(/ABC/i);
</script>
</body>
</html>

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