यह कैसे जांचें कि स्ट्रिंग में जावास्क्रिप्ट का विकल्प है या नहीं?


7427

आमतौर पर मैं एक String.contains()विधि की उम्मीद करता हूं , लेकिन ऐसा प्रतीत नहीं होता है।

इसके लिए जाँच करने का एक उचित तरीका क्या है?

जवाबों:


13769

ECMAScript 6 पेश किया गया String.prototype.includes:

const string = "foo";
const substring = "oo";

console.log(string.includes(substring));

includes हालांकि इंटरनेट एक्सप्लोरर का समर्थन नहीं है । ECMAScript 5 या पुराने परिवेशों में, उपयोग करें String.prototype.indexOf, जो रिटर्न -1 जब एक विकल्प नहीं मिल सकता है:

var string = "foo";
var substring = "oo";

console.log(string.indexOf(substring) !== -1);


25
मुझे या तो IE पसंद नहीं है, लेकिन अगर आपके पास दो कार्य हैं जो काफी हद तक समान हैं, और एक दूसरे की तुलना में बेहतर समर्थित है, तो मुझे लगता है कि आपको बेहतर समर्थित एक चुनना चाहिए? तो indexOf()यह है ...
लूटना

3
क्या एक मामले में असंवेदनशील खोज करना संभव है?
एरिक मैकविनेर

18
string.toUpperCase().includes(substring.toUpperCase())
रोड्रिगो पिंटो

2
@EricMcWinNEr /regexpattern/i.test(str)-> फ्लैग केस असंवेदनशीलता के लिए खड़ा है
कोड Maniac

यह Google App Script में मेरे लिए काम नहीं करता है।
रयान

559

String.prototype.includesES6 में एक है :

"potato".includes("to");
> true

ध्यान दें कि यह Internet Explorer या कुछ अन्य पुराने ब्राउज़रों में बिना या अपूर्ण ES6 समर्थन के काम नहीं करता है । यह पुराने ब्राउज़रों में काम करने के लिए, आप की तरह एक transpiler उपयोग करने के लिए इच्छा हो सकती है कोलाहल , की तरह एक शिम पुस्तकालय ES6-शिम , या इस MDN से polyfill :

if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }

    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}

3
बस करो "potato".includes("to");और इसे बाबेल के माध्यम से चलाओ।
डर्क जान स्पिलमैन

1
इसमें IE का समर्थन नहीं किया गया है
स्वीट चिल्ली फिली

@eliocs आप इसका जवाब दे सकते हैं। मुझे कोई एक संदेश मिल रहा है। संदेश को बदलने की जरूरत है stackoverflow.com/questions/61273744/…
sejn

1
इसके लिए एक और प्लस यह है कि मामला संवेदनशील होने के साथ-साथ है। "boot".includes("T")हैfalse
जोनाटास सीडी

47

एक अन्य विकल्प केएमपी (नूथ-मॉरिस-प्रैट) है।

एक length- के लिए KMP एल्गोरिदम वे खोज मीटर एक length- में सबस्ट्रिंग n स्ट्रिंग बुरी से बुरी हालत हे में ( n + मीटर ओ (की बुरी से बुरी हालत की तुलना में) समय, एनमीटर अनुभवहीन एल्गोरिथ्म के लिए), इसलिए KMP का उपयोग कर सकते हैं उचित हो अगर आप सबसे खराब स्थिति वाले समय की जटिलता की परवाह करते हैं।

यहाँ https://www.nayuki.io/res/knuth-morris-pratt-string-matching/kmp-string-matcher.js से लिया गया प्रोजेक्ट Nayuki द्वारा जावास्क्रिप्ट कार्यान्वयन किया गया है :

// Searches for the given pattern string in the given text string using the Knuth-Morris-Pratt string matching algorithm.
// If the pattern is found, this returns the index of the start of the earliest match in 'text'. Otherwise -1 is returned.

function kmpSearch(pattern, text) {
  if (pattern.length == 0)
    return 0; // Immediate match

  // Compute longest suffix-prefix table
  var lsp = [0]; // Base case
  for (var i = 1; i < pattern.length; i++) {
    var j = lsp[i - 1]; // Start by assuming we're extending the previous LSP
    while (j > 0 && pattern.charAt(i) != pattern.charAt(j))
      j = lsp[j - 1];
    if (pattern.charAt(i) == pattern.charAt(j))
      j++;
    lsp.push(j);
  }

  // Walk through text string
  var j = 0; // Number of chars matched in pattern
  for (var i = 0; i < text.length; i++) {
    while (j > 0 && text.charAt(i) != pattern.charAt(j))
      j = lsp[j - 1]; // Fall back in the pattern
    if (text.charAt(i) == pattern.charAt(j)) {
      j++; // Next char matched, increment position
      if (j == pattern.length)
        return i - (j - 1);
    }
  }
  return -1; // Not found
}

console.log(kmpSearch('ays', 'haystack') != -1) // true
console.log(kmpSearch('asdf', 'haystack') != -1) // false


11
यह overkill है, लेकिन फिर भी एक दिलचस्प जवाब है
Faissaloo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.