通常我会期望一个 String.contains() 方法,但似乎没有一个。
这是什么合理的方式来检查这一点?
通常我会期望一个 String.contains() 方法,但似乎没有一个。
这是什么合理的方式来检查这一点?
ECMAScript 6 引入 String.prototype. 包含:
const string = “foo”; const substring = “oo”; console.log(string.includes(substring)); // true
String.prototype.includes 是案例敏感的,并且不受 Internet Explorer 支持。
在 ECMAScript 5 或更古老的环境中,使用 String.prototype.indexOf,当无法找到基础时返回 -1:
var string = “foo”; var substring = “oo”; console.log(string.indexOf(substring)!== -1); // true
有一个 String.prototype. 包含在 ES6:
"potato".includes("to");
> true
请注意,在 Internet Explorer 或其他旧浏览器中,没有或不完整的 ES6 支持,以便在旧浏览器中运行,您可能希望使用像 Babel 这样的转换器,像 es6-shim 这样的图书馆,或来自 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;
}
};
}
另一个替代方案是KMP(Knuth-Morris-Pratt)。
KMP 算法在最糟糕的情况下 O(n+m)时间中寻找长度-m 序列,与天真算法中最糟糕的情况 O(n⋅m)相比,因此使用 KMP 可能合理,如果你关心最糟糕的情况时间复杂性。
// 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.
函数 kmpSearch(模式,文本) {如果(模式.长度 == 0)返回 0; // 即时匹配 // 计算最长的 suffix 预定表 var lsp = [0]; // 基案例为(var i = 1; i < 模式.长度; i++) { var j = lsp[i - 1]; // 开始假设我们正在扩展之前的 LSP 同时(j > 0 && 模式[i]!== 模式[j] j = lsp[j - 1]; 如果(模式[i] === 模式[j])