Jawaban:
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);
string.toUpperCase().includes(substring.toUpperCase())
/regexpattern/i.test(str)
-> i flag berarti kepekaan case
Ada String.prototype.includes
dalam 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;
}
};
}
"potato".includes("to");
dan jalankan melalui Babel.
"boot".includes("T")
adalahfalse
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 ( n ⋅ m ) 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
indexOf()
...