Bagaimana cara memeriksa apakah string berisi substring dalam JavaScript?

7427

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

Apa cara yang masuk akal untuk memeriksa ini?

Peter O.
sumber

Jawaban:

13776

ECMAScript 6 memperkenalkan String.prototype.includes:

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

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

includes tidak memiliki dukungan Internet Explorer . Dalam ECMAScript 5 atau lebih lama lingkungan, gunakan String.prototype.indexOf, yang mengembalikan -1 ketika substring tidak dapat ditemukan:

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

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

Ry-
sumber
25
Saya juga tidak suka IE, tetapi jika Anda memiliki dua fungsi yang sebagian besar identik, dan satu lebih didukung daripada yang lain, saya pikir Anda harus memilih yang didukung lebih baik? Begitulah indexOf()...
rob74
3
Apakah mungkin untuk melakukan pencarian kasus yang tidak sensitif?
Eric McWinNEr
18
string.toUpperCase().includes(substring.toUpperCase())
Rodrigo Pinto
2
@EricMcWinNEr /regexpattern/i.test(str)-> i flag berarti kepekaan case
Code Maniac
Ini sepertinya tidak berfungsi untuk saya di Google App Script.
Ryan
561

Ada String.prototype.includesdalam 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 bekerja di browser lama, Anda mungkin ingin menggunakan seperti transpiler Babel , perpustakaan shim seperti es6-shim , atau polyfill ini 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;
    }
  };
}
eliocs
sumber
3
Lakukan "potato".includes("to");dan jalankan melalui Babel.
Derk Jan Speelman
1
termasuk tidak didukung oleh IE dengan sedih
Sweet Chilly Philly
@eliocs dapatkah Anda menjawab ini. Saya menerima satu pesan. Perlu mengubah pesan stackoverflow.com/questions/61273744/…
sejn
1
Kelebihan lainnya adalah sensitif huruf juga. "boot".includes("T")adalahfalse
Jonatas CD
47

Alternatif lain adalah KMP (Knuth – Morris – Pratt).

Algoritma KMP mencari panjang- substring dalam string panjang- n dalam O kasus terburuk ( n + m ), dibandingkan dengan kasus terburuk O ( nm ) untuk algoritma naif, sehingga menggunakan KMP dapat masuk akal jika Anda peduli dengan kompleksitas waktu terburuk.

Berikut ini 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
}

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

Mark Amery
sumber
11
Ini adalah kerja keras tetapi jawaban yang menarik
Faissaloo