it-swarm-tr.com

Bir dizginin JavaScript'te bir alt dize içerip içermediği nasıl kontrol edilir?

Genelde String.contains() yöntemini beklerdim, ancak bir yöntem görünmüyor.

Bunu kontrol etmenin makul bir yolu nedir?

7434
gramm

ES6 tanıtıldı String.prototype.includes :

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

string.includes(substring)

includes, IE desteğine sahip değil . Bir ES5 veya daha eski bir ortamda, alt dizeyi bulamadığında −1 döndüren String.prototype.indexOf , bunun yerine kullanılabilir:

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

string.indexOf(substring) !== -1
12677
Fabien Ménager

ES6'da bir String.prototype.includes var :

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

Bunun Internet Explorer'da veya diğer bazı eski tarayıcılarda çalışmadığını , ES6 desteği olmadan veya tamamlanmamış olduğunu unutmayın. Eski tarayıcılarda çalışmasını sağlamak için, Babel gibi bir aktarıcı, es6-shim gibi bir kitaplık kütüphanesi veya bu MDN'den 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;
    }
  };
}
438
eliocs

Başka bir alternatif ise KMP .

KMP algoritması, en kötü durumlu doğrusal zaman alt dizisi araması sağlar, bu nedenle en kötü durumlu zaman karmaşıklığına önem verirseniz makul bir yoldur.

İşte Project Nayuki'nin https://www.nayuki.io/res/knuth-morris-pratt-string-matching/kmp-string-matcher.js adresinden alınan bir JavaScript uygulaması.

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

Örnek kullanım:

kmpSearch('ays', 'haystack') != -1 // true
kmpSearch('asdf', 'haystack') != -1 // false
8
wz366