it-swarm-id.com

Bagaimana cara memeriksa apakah string berisi substring dalam JavaScript?

Biasanya saya mengharapkan metode String.contains(), tetapi sepertinya tidak ada satu.

Apa cara yang masuk akal untuk memeriksa ini?

7434
gramm

ES6 memperkenalkan String.prototype.includes :

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

string.includes(substring)

includesmeskipun tidak memiliki IE dukungan , meskipun. Di lingkungan ES5 atau yang lebih lama, String.prototype.indexOf , yang mengembalikan −1 ketika tidak menemukan substring, dapat digunakan sebagai gantinya:

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

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

Ada String.prototype.includes di ES6 :

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

Perhatikan bahwa ini tidak berfungsi di Internet Explorer atau browser lama lainnya tanpa dukungan ES6 atau tidak lengkap. Untuk membuatnya berfungsi di browser lama, Anda mungkin ingin menggunakan transpiler seperti Babel , perpustakaan shim seperti es6-shim , atau this polyfill dari MDN :

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

Alternatif lain adalah KMP .

Algoritma KMP menyediakan pencarian substring linear waktu terburuk, jadi ini adalah cara yang masuk akal jika Anda peduli dengan kompleksitas waktu terburuk.

Berikut adalah implementasi JavaScript oleh Project Nayuki, diambil dari https://www.nayuki.io/res/knuth-morris-pratt-string-matching/kmp-string-matcher.js :

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

Contoh penggunaan:

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