Câu trả lời:
Giới thiệu ECMAScript 6 String.prototype.includes
:
const string = "foo";
const substring = "oo";
console.log(string.includes(substring));
includes
Mặc dù vậy, không có hỗ trợ Internet Explorer . Trong môi trường ECMAScript 5 trở lên, sử dụng String.prototype.indexOf
, trả về -1 khi không thể tìm thấy chuỗi con:
var string = "foo";
var substring = "oo";
console.log(string.indexOf(substring) !== -1);
string.toUpperCase().includes(substring.toUpperCase())
/regexpattern/i.test(str)
-> i cờ là viết tắt của trường hợp không nhạy cảm
Có một String.prototype.includes
trong ES6 :
"potato".includes("to");
> true
Lưu ý rằng điều này không hoạt động trong Internet Explorer hoặc một số trình duyệt cũ khác không có hoặc không hỗ trợ ES6. Để làm cho nó hoạt động trong các trình duyệt cũ, bạn có thể muốn sử dụng một bộ chuyển mã như Babel , thư viện shim như es6-shim hoặc polyfill này từ 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");
và chạy nó qua Babel.
"boot".includes("T")
làfalse
Một lựa chọn khác là KMP (Knuth Thẻ Morris, Pratt).
Các thuật toán KMP tìm kiếm cho một length- m substring trong một length- n chuỗi trong trường hợp xấu nhất O ( n + m ) thời gian, so với một trường hợp tồi tệ nhất của O ( n ⋅ m ) cho các thuật toán ngây thơ, vì vậy sử dụng KMP thể là hợp lý nếu bạn quan tâm đến sự phức tạp thời gian trường hợp xấu nhất.
Đây là một triển khai JavaScript của Project Nayuki, được lấy từ https://www.nayuki.io/res/knuth-morris-pratt-opes-matching/kmp-opes-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()
là ...